当前位置:   article > 正文

JPA关系模型——一对一及一对多关系_java jpa 树 一对多注解

java jpa 树 一对多注解

一对一关系

前面说到JPA关系模型有好几种,今天就举例说明关系模型中的一对一关系。在JPA(Java持久化API)中,可以使用注解来表示一对一关系。举例如下:

首先,我们有两个实体类,UserUserProfile,它们之间是一对一的关系。

  1. @Entity
  2. @Table(name = "users")
  3. public class User
  4. {
  5. @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. private Long id; private String username;
  7. @OneToOne(mappedBy = "user")
  8. private UserProfile userProfile;
  9. // 构造函数、getter和setter方法等省略 }
  10. @Entity @Table(name = "user_profiles")
  11. public class UserProfile
  12. {
  13. @Id
  14. private Long id;
  15. private String firstName;
  16. private String lastName;
  17. @OneToOne @JoinColumn(name = "user_id")
  18. private User user;
  19. // 构造函数、getter和setter方法等省略
  20. }

User实体类中,使用@OneToOne(mappedBy = "user")注解表示与UserProfile实体类的关系,mappedBy属性指定了关系维护的端,即UserProfile类中的user属性。

UserProfile实体类中,使用@OneToOne注解表示与User实体类的关系,@JoinColumn注解指定了外键列的名称,这里使用了user_id

接下来,我们可以使用JPA进行数据库操作,例如保存和查询一对一关系的数据:

 

  1. EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("YourPersistenceUnit");
  2. EntityManager entityManager = entityManagerFactory.createEntityManager();
  3. // 创建User对象
  4. User user = new User();
  5. user.setUsername("john_doe");
  6. // 创建UserProfile对象
  7. UserProfile userProfile = new UserProfile();
  8. userProfile.setFirstName("John"); userProfile.setLastName("Doe");
  9. // 建立关系
  10. user.setUserProfile(userProfile);
  11. userProfile.setUser(user);
  12. // 保存数据
  13. entityManager.getTransaction().begin();
  14. entityManager.persist(user);
  15. entityManager.persist(userProfile);
  16. entityManager.getTransaction().commit();
  17. // 查询数据
  18. User savedUser = entityManager.find(User.class, user.getId());
  19. UserProfile savedProfile = savedUser.getUserProfile(); System.out.println(savedUser.getUsername()); System.out.println(savedProfile.getFirstName()); System.out.println(savedProfile.getLastName()); entityManager.close(); entityManagerFactory.close();

上述代码中,我们首先创建了一个User对象和一个UserProfile对象,并建立了它们之间的关系。然后,通过调用EntityManagerpersist()方法将它们保存到数据库中。但是不建议我们在实际中直接使用entityManage,因为有太多的细节需要我们自己把控!

最后,我们使用find()方法查询保存的数据,并输出用户名和用户配置文件的信息。

 一对多关系

通过前面几篇文章的学习,我们了解到了JPA的几种关系模型,并举例说明了一对一的关系模型。下面就举个简单例子说明一下一对多的关系模型,也是我们在实际开发中用的最多的一种。

假设我们有两个实体类,Department和Employee,它们之间是一对多的关系,一个部门可以有多个员工。

  1. @Entity
  2. @Table(name = "departments")
  3. public class Department {
  4.     @Id
  5.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  6.     private Long id;
  7.     private String name;
  8.     @OneToMany(mappedBy = "department")
  9.     private List<Employee> employees;
  10.     // 构造函数、getter和setter方法等省略
  11. }
  12. @Entity
  13. @Table(name = "employees")
  14. public class Employee {
  15.     @Id
  16.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  17.     private Long id;
  18.     private String name
  19.     @ManyToOne
  20.     @JoinColumn(name = "department_id")
  21.     private Department department;
  22.     // 构造函数、getter和setter方法等省略
  23. }

在Department实体类中,使用@OneToMany(mappedBy = "department")注解表示与Employee实体类的关系,mappedBy属性指定了关系维护的端,即Employee类中的department属性。

在Employee实体类中,使用@ManyToOne注解表示与Department实体类的关系,@JoinColumn注解指定了外键列的名称,这里使用了department_id。

接下来,我们可以使用JPA进行数据库操作,例如保存和查询一对多关系的数据:

  1. EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("YourPersistenceUnit");
  2. EntityManager entityManager = entityManagerFactory.createEntityManager();
  3. // 创建Department对象
  4. Department department = new Department();
  5. department.setName("IT Department");
  6. // 创建Employee对象
  7. Employee employee1 = new Employee();
  8. employee1.setName("John Doe");
  9. employee1.setDepartment(department);
  10. Employee employee2 = new Employee();
  11. employee2.setName("Jane Smith");
  12. employee2.setDepartment(department);
  13. // 建立关系
  14. department.setEmployees(Arrays.asList(employee1, employee2));
  15. // 保存数据
  16. entityManager.getTransaction().begin();
  17. entityManager.persist(department);
  18. entityManager.persist(employee1);
  19. entityManager.persist(employee2);
  20. entityManager.getTransaction().commit();
  21. // 查询数据
  22. Department savedDepartment = entityManager.find(Department.class, department.getId());
  23. List<Employee> employees = savedDepartment.getEmployees();
  24. for (Employee employee : employees) {
  25.     System.out.println(employee.getName());
  26. }
  27. entityManager.close();
  28. entityManagerFactory.close();

上述代码中,我们首先创建了一个Department对象和两个Employee对象,并建立了它们之间的关系。然后,通过调用EntityManager的persist()方法将它们保存到数据库中。

最后,我们使用find()方法查询保存的数据,并遍历打印部门中的员工名字。

上面只是一个很简单的实例。我们在实际的工作中基本也不会遇到这种,。但是不管多么复杂都是按照这个套路来就行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/530949
推荐阅读
相关标签
  

闽ICP备14008679号