赞
踩
前面说到JPA关系模型有好几种,今天就举例说明关系模型中的一对一关系。在JPA(Java持久化API)中,可以使用注解来表示一对一关系。举例如下:
首先,我们有两个实体类,User
和UserProfile
,它们之间是一对一的关系。
- @Entity
- @Table(name = "users")
- public class User
- {
- @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Long id; private String username;
- @OneToOne(mappedBy = "user")
- private UserProfile userProfile;
- // 构造函数、getter和setter方法等省略 }
- @Entity @Table(name = "user_profiles")
-
-
- public class UserProfile
- {
- @Id
- private Long id;
- private String firstName;
- private String lastName;
- @OneToOne @JoinColumn(name = "user_id")
- private User user;
- // 构造函数、getter和setter方法等省略
- }
在User
实体类中,使用@OneToOne(mappedBy = "user")
注解表示与UserProfile
实体类的关系,mappedBy
属性指定了关系维护的端,即UserProfile
类中的user
属性。
在UserProfile
实体类中,使用@OneToOne
注解表示与User
实体类的关系,@JoinColumn
注解指定了外键列的名称,这里使用了user_id
。
接下来,我们可以使用JPA进行数据库操作,例如保存和查询一对一关系的数据:
- EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("YourPersistenceUnit");
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- // 创建User对象
- User user = new User();
- user.setUsername("john_doe");
- // 创建UserProfile对象
- UserProfile userProfile = new UserProfile();
- userProfile.setFirstName("John"); userProfile.setLastName("Doe");
- // 建立关系
- user.setUserProfile(userProfile);
- userProfile.setUser(user);
- // 保存数据
- entityManager.getTransaction().begin();
- entityManager.persist(user);
- entityManager.persist(userProfile);
- entityManager.getTransaction().commit();
- // 查询数据
- User savedUser = entityManager.find(User.class, user.getId());
- 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
对象,并建立了它们之间的关系。然后,通过调用EntityManager
的persist()
方法将它们保存到数据库中。但是不建议我们在实际中直接使用entityManage,因为有太多的细节需要我们自己把控!
最后,我们使用find()
方法查询保存的数据,并输出用户名和用户配置文件的信息。
通过前面几篇文章的学习,我们了解到了JPA的几种关系模型,并举例说明了一对一的关系模型。下面就举个简单例子说明一下一对多的关系模型,也是我们在实际开发中用的最多的一种。
假设我们有两个实体类,Department和Employee,它们之间是一对多的关系,一个部门可以有多个员工。
- @Entity
-
- @Table(name = "departments")
-
- public class Department {
-
- @Id
-
- @GeneratedValue(strategy = GenerationType.IDENTITY)
-
- private Long id;
-
- private String name;
-
- @OneToMany(mappedBy = "department")
-
- private List<Employee> employees;
-
- // 构造函数、getter和setter方法等省略
-
- }
-
-
-
- @Entity
-
- @Table(name = "employees")
-
- public class Employee {
-
- @Id
-
- @GeneratedValue(strategy = GenerationType.IDENTITY)
-
- private Long id;
-
- private String name
-
- @ManyToOne
-
- @JoinColumn(name = "department_id")
-
- private Department department;
-
- // 构造函数、getter和setter方法等省略
-
- }
在Department实体类中,使用@OneToMany(mappedBy = "department")注解表示与Employee实体类的关系,mappedBy属性指定了关系维护的端,即Employee类中的department属性。
在Employee实体类中,使用@ManyToOne注解表示与Department实体类的关系,@JoinColumn注解指定了外键列的名称,这里使用了department_id。
接下来,我们可以使用JPA进行数据库操作,例如保存和查询一对多关系的数据:
- EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("YourPersistenceUnit");
-
- EntityManager entityManager = entityManagerFactory.createEntityManager();
-
-
-
- // 创建Department对象
-
- Department department = new Department();
-
- department.setName("IT Department");
-
-
-
- // 创建Employee对象
-
- Employee employee1 = new Employee();
-
- employee1.setName("John Doe");
-
- employee1.setDepartment(department);
-
-
-
- Employee employee2 = new Employee();
-
- employee2.setName("Jane Smith");
-
- employee2.setDepartment(department);
-
-
-
- // 建立关系
-
- department.setEmployees(Arrays.asList(employee1, employee2));
-
-
- // 保存数据
-
- entityManager.getTransaction().begin();
-
- entityManager.persist(department);
-
- entityManager.persist(employee1);
-
- entityManager.persist(employee2);
-
- entityManager.getTransaction().commit();
-
-
- // 查询数据
-
- Department savedDepartment = entityManager.find(Department.class, department.getId());
-
- List<Employee> employees = savedDepartment.getEmployees();
-
- for (Employee employee : employees) {
-
- System.out.println(employee.getName());
-
- }
-
-
- entityManager.close();
-
- entityManagerFactory.close();
上述代码中,我们首先创建了一个Department对象和两个Employee对象,并建立了它们之间的关系。然后,通过调用EntityManager的persist()方法将它们保存到数据库中。
最后,我们使用find()方法查询保存的数据,并遍历打印部门中的员工名字。
上面只是一个很简单的实例。我们在实际的工作中基本也不会遇到这种,。但是不管多么复杂都是按照这个套路来就行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。