为什么打开未实例化的(实体)对象列表会还原对同一事务中任何一个所述对象所做的更改?
场景:
如果我在交易中执行以下操作:
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,但这不是一个令人满意的解决方案,更不用说解决问题
答案 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属性时不要使用==