给定两个实体Department
并形成从到Employee
的一对多关系。Department
Employee
由于关系非常直观,因此我省略了实体类。
下面的代码段,只是持久化了一个实体Employee
。
public void insert() {
Employee employee = new Employee();
employee.setEmployeeName("k");
Department department = entityManager.find(Department.class, 1L);
employee.setDepartment(department);
entityManager.persist(employee);
entityManager.flush();
List<Employee> employeeList = department.getEmployeeList();
employeeList.add(employee);
}
以下方法返回与特定部门关联的员工列表。
public List<Employee> getList() {
return entityManager.find(Department.class, 1L).getEmployeeList();
}
这两种方法都是使用名为 let's say 的 CMT(此处不是 BMT)在无状态 EJB 中编写的 EmployeeService
。
客户端应用程序按顺序调用这些方法,如下所示,
employeeService.insert();
List<Employee> employeeList = employeeService.getList();
for (Employee e : employeeList) {
System.out.println(e.getEmployeeId() + " : " + e.getEmployeeName());
}
上面循环中的sout
语句显示了一个新添加的实体,其中包含一个,因为该行不存在于第一个代码片段中。foreach
Employee
List<Employee>
Department
null
employeeId
entityManager.flush();
EntityManager#persist(Object entity)
不保证生成id。id 只保证在刷新时生成。
发生的情况是,如果entityManager.flush();
被删除/注释,则实体Employee
将添加到Employee
s ( List<Employee> employeeList
) 列表中,其中包含null
标识符(基础数据库表中的主键列)。
维持双向关系的常用方法是什么?EntityManager#flush();
每次将实体添加到由关系的反面维护的实体集合以生成与新持久化实体相关联的 id 时,是否总是需要?
此外,在删除实体(使用)时是否总是需要手动删除Employee
from List<Employee>
(由关系的反面维护 - )?Department
Employee
entityManager.remove(employee);
编辑:实体类:
部门 :
@Entity
@Table(catalog = "testdb", schema = "", uniqueConstraints = {
@UniqueConstraint(columnNames = {"department_id"})})
public class Department implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "department_id", nullable = false)
private Long departmentId;
@Column(name = "department_name", length = 255)
private String departmentName;
@Column(length = 255)
private String location;
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
private List<Employee> employeeList = new ArrayList<Employee>(0);
private static final long serialVersionUID = 1L;
// Constructors + getters + setters + hashcode() + equals() + toString().
}
员工 :
@Entity
@Table(catalog = "testdb", schema = "", uniqueConstraints = {
@UniqueConstraint(columnNames = {"employee_id"})})
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "employee_id", nullable = false)
private Long employeeId;
@Column(name = "employee_name", length = 255)
private String employeeName;
@JoinColumn(name = "department_id", referencedColumnName = "department_id")
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
private static final long serialVersionUID = 1L;
// Constructors + getters + setters + hashcode() + equals() + toString().
}