繁体   English   中英

同一EJB事务中的多次刷新导致第一次刷新的更改消失

[英]Multiple flush in same EJB transaction causing the changes of the first flush disappear

我有一个容器管理的事务,在一种方法中,有一个与该事务相关联的实体管理器。 我拥有的表是一个父表,并且是另一个包含该父表的子表的表的关联。

在同一会话中,我按以下顺序执行以下各项:最初,在会话中我们将没有父对象或子对象。但是父对象将存在于数据库中,而子对象将添加到我们所使用的方法中有兴趣 。

  1. 我从会话中的数据库获取父对象,因此该父对象将在会话中。
  2. 我创建了一个新的子记录并将该子记录与父表相关联,因为父表是会话休眠的一部分,因此必须注意将子记录正确地添加到子表中。
  3. 然后我将在这一点上进行冲洗。
  4. 再次,我将向父级集合中添加一个新子级
  5. 正如之前所说的,休眠必须注意添加仪式吗?
  6. 我现在再次进行冲洗。
  7. 在EJB事务结束时,休眠将生成所有其他sql语句。

执行完这些操作后,我发现在数据库中,只有第二次添加的子级才与父表相关联。但是对于第一个子项存在,但未设置父级关联。

如果我删除添加孩子之间的冲洗,则两个孩子都正确地与父对象关联。冲洗在这里引起问题,但我必须在此处使用冲洗,因为要考虑到我一次拍摄会关联100个孩子,所以考虑在内执行同花顺,稍后我将关联另外10个孩子,然后仅对最后10个同子集进行同花顺,其他所有孩子都处于孤儿阶段。这给我造成了问题!:(

请评论一下如何解决此问题。在刷新之前,我是否应该执行其他一些操作,例如update或saveOrUpdate?

该算法在这里,请找到它:由于代码又长又长,我将发布该操作如何执行的算法。假设我有2个表,其中一个表用于父级PARENT,另一个表用于子级CHILD \\和该子级。实体是从父实体扩展而来的。假设最初我在数据库中只有一个父记录,而子表中没有CHILD记录,则子与父之间存在一对多的双向链接,反之亦然。 在事务开始时,我将从DB获得父数据,以便使父数据与持久性上下文相关联。 现在假设我正在创建一个新的子POGO对象并填充其数据。 假设我将创建20个这样的对象,然后将双向子对象与父对象以及父对象与子对象关联。 由于当我将父级关联到子级时,父级处于休眠状态,因此hibernate将负责创建和建立链接。 现在假设我对会话上下文进行了刷新。 接下来,我再创建10个孩子的POGO对象,并对父对象进行相同的关联,然后再次进行刷新。

在事务结束后,当我检查数据库时,我看到数据库中有前20个条目,但是它们与父级的关联不存在。 但是对于最后添加的10个子对象,父项的条目和关联都在那里。

当我删除在20到10之间添加孩子之间的冲洗时,我看到所有30都正确地关联了。 我想知道为什么冲洗会引起问题。

如果您按照休眠参考中所述使用双向关系,则需要格外小心:

<class name="Person">
 <id name="id" column="personId">
     <generator class="native"/>
 </id>
 <many-to-one name="address"          column="addressId"         not-null="true"/>
</class> 
<class name="Address">
 <id name="id" column="addressId">
     <generator class="native"/>
 </id>
 <set name="people" inverse="true">
     <key column="addressId"/>
     <one-to-many class="Person"/>
 </set>
</class>

在这种情况下,如果您将一个人添加到address.people,但person.address为null,则休眠将不会保存该人,因为address.people关系为inverse =“ true”。

您需要为休眠设置关系的两个方向以正确保存它:

public void addPerson(Person person) {
    person.setAddress(this);
    this.people.add(person);
}

请参阅休眠教程中的1.2.6双向链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM