2012-06-01 171 views
0

我对关系中管理实体感到困惑。根据 PRO JPA2,关系应在关系的两端手动配置和分配。关于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表,但我查了德比,这是 能够正确执行更新

考虑行[2]: 根据这本书,这是正确的方法。

任何人都可以帮助清除我的疑问吗?

的EclipseLink /德比/ JPA2

回答

1

如果你不喜欢它的线[1],员工“E1”将被存储在数据库与FK确定,但...如果你系DEPT1和调用装getEmployees();员工'e1'将不在此列表中。即使您重新进行查询以从数据库中获取该部分,它不会有Employee'e1'(至少在您重新申请应用程序之前)。这就是为什么你应该总是这样做[2]。
当我开始使用JPA2时,我不知道这一点;并坚持像[1]中的实体。我几乎疯了,试图确定为什么最近持久的实体不被JPA读取,但实际上存储在数据库中。

+0

啊..所以这就是原因..谢谢Damian。 –

+0

@MarkEstrada没问题! – Damian