2017-02-21 92 views
0

我有部门实体,其中包含雇员名单。假设部门A拥有员工1到员工10的员工名单。hibernate应该如何在这种情况下工作?

Step 1 
     Department dept=(Department)session.get(Department.class, 100); // Department A 


Step 2 

     List<Employee> employees = dept.getEmployees();// it contains employee 1 also 
     Now get employee for id1 from above list and modify the address to address 2   

Step 3 
     Employee emp_step_3=(Employee)session.get(Employee.class, 1); 
     //updates employee address address 3 with session.saveOrUpdate(emp_step_3); 

Step 4  
     session.saveOrUpdate(dept); 

问题

  1. 威尔员工1对象下的员工名单在步骤2将同emp_step_3?
  2. 应该在步骤3对员工ID 1进行查询,因为它已经在步骤2取得了?
  3. 应为地址2或3更新员工1?

仅供参考,我使用级联所有在步骤2中的所有关联

下的员工名单
+0

您可以分享你的部门和员工的对象请。这将有助于让你的问题得到解答...希望。 –

回答

0

1-威尔员工1对象将是相同的 为emp_step_3?

是的。如果第1步将该部门的所有员工拖入托管会话中,则该部门的员工实体将成为托管实体,因此,当您通过ID获取其中一个员工时,Hibernate将返回同一个实体。 (假设级联全部)

2-应该在第3步为员工ID 1进行查询,因为它已经在步骤2取得了 ?

不是真的,您已经拥有代表您想要的员工的实体。

3-应为地址2或3更新员工1?

是地址管理实体吗?你有级联吗?如果您保存地址已更改的员工,它也会保存关联的实体。 (同样,如果级联全部,或级联坚持打开)或者如果它是一个托管实体,您可以保存该地址。

此外,您可以执行session.saveOrUpdate(employee),如果没有任何更改,您不必保存“部门”。

这是假定所有这些发生在同一个会话中。

希望这会有所帮助。

+0

你是对的。这是应该的。但实际上这不是我正在观察的行为。其实我正在使用JPA与休眠作为实现。 JPA使用实体管理器而不是会话。你知道它是否有问题吗? –

+0

我不确定你在问什么。我知道如果什么是问题? JPA规范深受Hibernate的影响,大部分JPA指定了实现必须或应该做的事情,并将一些东西留给了Hibernate和EclipseLink等实现者。你正在经历的行为是什么?你可以分享一些代码吗? – raminr

相关问题