我对在关系中管理实体感到困惑。根据PRO JPA2一书,应该在关系的两端手动配置和分配关系。
现在,考虑一下这种关系。
@Entity
public class Employee {
..
@ManyToOne(cascade=CascadeType.PERSIST)
private Department department;
..
}
@Entity
public class Department {
..
@OneToMany(mappedBy="department")
private Set<Employee> employees = new HashSet<Employee>();
public void addEmployee(Employee e){
getEmployees().add(e);
e.setDepartment(this);
}
}
我做了一个简单的测试用例,涉及这行代码来验证这一点。
Department dept1 = new Department();
dept1.setName("MARKETING");
Employee e1 = new Employee();
e1.setName("JOHN DOE");
e1.setDepartment(dept1); //[1]
//dept1.addEmployee(e1); //[2]
考虑第[1]行:
我认为这不能正确更新具有正确部门ID的Employee表,但我检查了Derby并且能够正确执行更新。
考虑第[2]行:
根据这本书,这是正确的方法。
的EclipseLink /德比/ JPA2
答案 0 :(得分:1)
如果你在第[1]行中这样做,那么员工'e1'将存储在FK ok的数据库中,但是......如果你得到Department dept1并调用getEmployees();员工'e1'不在此列表中。即使你创建了一个新的查询来再次从数据库中获取该数据;它不会有Employee'e1'(至少在您重新部署应用程序之前)。这就是为什么你应该总是这样做[2]。
当我开始使用JPA2时,我不知道这一点;并且像[1]中那样坚持实体。我几乎疯了,试图确定最近持久化的实体为什么不被JPA读取,但实际存储在数据库中。