JPA 一对多映射是 JPA 中最常用的映射方式,它表示一个实体对象可以关联到多个实体对象。在 JPA 中,一对多映射可以使用 @OneToMany 注释来实现,这个注释可以放在一个实体类上,表示这个实体类可以关联到多个其他实体。
@Entity public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "employee") private Listprojects; // getters and setters... }
上面的代码演示了如何使用 @OneToMany 注释来创建一对多映射。在这里,我们将 Employee 实体和 Project 实体之间建立了一对多的关联。Employee 实体有一个 projects 字段,该字段是一个 List 类型的集合,用于存储 Employee 关联的 Project 实例。
以下代码表示非类型的java.util.Map的目标实体类。
@OneToMany(targetEntity=Employee.class, mappedBy="department") @MapKey private Map employees;
下面的代码来自PersonDaoImpl.java。
package cn..common; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Transactional; @Transactional public class PersonDaoImpl { public void test() { Employee e = new Employee(); e.setName("Tom"); Department d = new Department(); d.setName("test"); d.getEmployees().put(e, e.getId()); em.persist(e); em.persist(d); } @PersistenceContext private EntityManager em; }
下面的代码来自Department.java。
package cn..common; import java.util.HashMap; import java.util.Map; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MapKey; import javax.persistence.OneToMany; @Entity public class Department { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; @OneToMany(targetEntity=Employee.class, mappedBy="department") @MapKey private Map employees; public Department() { employees = new HashMap(); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String deptName) { this.name = deptName; } public void addEmployee(Employee employee) { employees.put(employee.getId(), employee); if (employee.getDepartment() != null) { employee.getDepartment().getEmployees().remove(employee.getId()); } employee.setDepartment(this); } public Map getEmployees() { return employees; } public String toString() { StringBuffer aBuffer = new StringBuffer("Department "); aBuffer.append(" id: "); aBuffer.append(id); aBuffer.append(" name: "); aBuffer.append(name); aBuffer.append(" employeeCount: "); if(null != employees) { aBuffer.append(employees.size()); } return aBuffer.toString(); } }
以下代码来自Employee.java。
package cn..common; import java.util.Map; import java.util.Set; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.MapKeyClass; import javax.persistence.MapKeyColumn; @Entity public class Employee { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private int id; private String name; private long salary; @ElementCollection(targetClass=String.class) @CollectionTable(name="EMP_PHONE") @MapKeyColumn(name="PHONE_TYPE") @MapKeyClass(String.class) @Column(name="PHONE_NUM") private Map phoneNumbers; @ManyToOne private Department department; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getSalary() { return salary; } public void setSalary(long salary) { this.salary = salary; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } public Map getPhoneNumbers() { return phoneNumbers; } public void setPhoneNumbers(Map phoneNumbers) { this.phoneNumbers = phoneNumbers; } public String toString() { StringBuffer aBuffer = new StringBuffer("Employee "); aBuffer.append(" id: "); aBuffer.append(id); aBuffer.append(" with dept: "); if(null != department) { aBuffer.append(department.getName()); } aBuffer.append(" phoneNumbers: "); for (Map.Entry e : (Set<Map.Entry>)phoneNumbers.entrySet()) { aBuffer.append(e.getKey() + "[" + e.getValue() + "] "); } return aBuffer.toString(); } }下载 OneToMany_untyped_Maps.zip
以下是数据库转储。
Table Name: DEPARTMENT Row: Column Name: ID, Column Type: INTEGER: Column Value: 1 Column Name: NAME, Column Type: VARCHAR: Column Value: test Table Name: EMPLOYEE Row: Column Name: ID, Column Type: INTEGER: Column Value: 1 Column Name: NAME, Column Type: VARCHAR: Column Value: Tom Column Name: SALARY, Column Type: BIGINT: Column Value: 0 Column Name: DEPARTMENT_ID, Column Type: INTEGER: Column Value: null Table Name: EMP_PHONE
JPA教程 -JPA持久关系级联示例以下代码显示级联持久操作。例子下面的代码来自PersonDaoImpl.java。package cn..common;import ja...
JPA教程 - JPA 类型化查询示例以下代码创建了一个类型化的查询。TypedQuery可以有通用参数。TypedQueryProfessor query = em.cre...
JPA教程 - JPA查询GroupBy Having例子以下代码显示了如何在JPQL中使用GROUP BY和HAVING子句。List l = em.createQuery(...
Lucene教程 -Lucene索引文件索引是识别文档并为搜索准备文档的过程。下表列出了索引过程中常用的类。类描述IndexWriter在索引过...