Orm 关于JPA2中的关系管理

Orm 关于JPA2中的关系管理,orm,jpa-2.0,eclipselink,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"

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

现在,考虑这个关系。

@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);
    }
}
考虑第[1]行:

我认为这不会用正确的部门ID正确地更新Employee表,但我检查了Derby,它能够正确地执行更新

考虑第[2]行:

根据这本书,这是正确的方法


Eclipselink/Derby/JPA2

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