关于JPA2中的关系管理

时间:2012-06-01 02:15:53

标签: orm jpa-2.0 eclipselink

我对在关系中管理实体感到困惑。根据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

1 个答案:

答案 0 :(得分:1)

如果你在第[1]行中这样做,那么员工'e1'将存储在FK ok的数据库中,但是......如果你得到Department dept1并调用getEmployees();员工'e1'不在此列表中。即使你创建了一个新的查询来再次从数据库中获取该数据;它不会有Employee'e1'(至少在您重新部署应用程序之前)。这就是为什么你应该总是这样做[2]。
当我开始使用JPA2时,我不知道这一点;并且像[1]中那样坚持实体。我几乎疯了,试图确定最近持久化的实体为什么不被JPA读取,但实际存储在数据库中。

相关问题