通过前面几篇文章的学习,我们了解到了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()方法查询保存的数据,并遍历打印部门中的员工名字。
上面只是一个很简单的实例。我们在实际的工作中基本也不会遇到这种,。但是不管多么复杂都是按照这个套路来就行。