Java - JPA - 实例化子实体列表将还原已在事务中对其中一个实例所做的更改

时间:2013-08-26 03:03:58

标签: java jpa collections entity reverting

为什么打开未实例化的(实体)对象列表会还原对同一事务中任何一个所述对象所做的更改?

场景:

  • A,B和C都是实体
  • A保存对B的特定实例的引用,可以使用a.getB();
  • 检索
  • C有一个B对象列表,可以通过c.getListOfB()
  • 检索
  • 以下情况属实:c.getListOfB()。contains(a.getB())
  • 以下测试也是如此:a.getB()== c.getListOfB()。get(properIndex)(相同的对象引用)

如果我在交易中执行以下操作:

B b = a.getB();    
b.setOk(true); // <-- Changed from false to true

然后跟着:

c.getListOfB().isEmpty() // <-- Any function will do, I just used .isEmpty() to test it

然后b IMMEDIATELY再次将OK值设置为false:/

在提交到DB之前,这发生在同一个Transaction中。

有人可以非常友好地向我解释为什么EntityManager不知道已经对交易中的上述实体所做的更改,以及如何确保它保留它们?这导致我进行了长时间的追捕,而且我真的失去了如何在线找到任何有用结果的文字。

编辑:问题是,当我使用.isEmpty()方法实例化List时,JPA“再次”从DB中读取子对象,将我已经对其中一个子进行的更改还原交易早些时候。我觉得它应该知道其中一个子对象已经处于持久化上下文中并且没有与它混淆。

我目前正在通过调用c.getListOfB()。isEmpty()来解决这个问题,即在对b进行更改之前实例化List,但这不是一个令人满意的解决方案,更不用说解决问题

2 个答案:

答案 0 :(得分:0)

使变量保持静态,以便使用相同的实例。

答案 1 :(得分:0)

a.getB()== c.getListOfB()。get(properIndex)不正确。

在比较两个对象时,请使用equals()方法而不是“==”

==将比较对象引用。

equals()比较对象属性。

在您的情况下,您需要比较该对象的主键,该主键是实体对象的一个​​属性。

以下是:c.getListOfB()。contains(a.getB())

以下是真的:a.getB()。equals(c.getListOfB()。get(properIndex))

在调用a.getB()和c.getListOfB()时,不确定hibernate是否会返回相同的引用实例.get(properIndex)所以在比较两个objecs属性时不要使用==