0

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

4

1 回答 1

1

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

于 2012-06-01T14:04:54.030 回答