【发布时间】:2013-09-29 14:20:17
【问题描述】:
我有一个容器管理的事务,并且在一种方法中,它有一个与该事务关联的实体管理器。我拥有的表是一个父表和另一个表的关联,该表包含父表的子表。
在同一会话中,我按以下提到的顺序执行以下项目: 最初在会话中我们不会有父对象或子对象。但是父对象将存在于数据库中,子对象将添加到我们感兴趣的方法中。
- 我在会话中从数据库中获取父对象,所以这个父对象 对象将在会话中。
- 我创建了一个新的子记录并将这个子记录关联到父表,因为父表是会话的一部分,所以休眠必须注意在子表中添加子记录正确吗??
- 然后我将在此时执行刷新。
- 我再次将一个新的子元素添加到父元素的集合中
- 如前所述,hibernate 必须注意添加它的仪式?
- 我现在再次执行刷新。
- 在 EJB 事务结束时,休眠将生成所有其他 sql 语句。
执行这些操作后,我看到在数据库中只有第二次添加的子项与父表相关联。但第一个子项存在但父关联未设置。
如果我在添加孩子之间删除刷新,两个孩子都正确关联到父级。刷新在这里引起了问题,但我必须不惜一切代价在这里使用刷新,因为考虑到我关联了 100 个孩子一旦拍摄然后执行冲洗,稍后我将关联另外 10 个孩子,然后进行冲洗,只有最后 10 个孩子与父母相关联,所有其他孩子都处于孤儿阶段。这对我来说是个问题!:(
请评论如何解决这个问题。我应该在刷新之前执行一些其他操作,如更新或 saveOrUpdate 吗?
算法在这里,请找到它: 由于代码又大又长,我将发布如何执行操作的算法 假设我有 2 个表,其中一个用于名为 PARENT 的父级,另一个用于名为 CHILD 的子级\ 并且子实体是从父实体扩展而来的 假设最初我在数据库中只有一个父记录,并且子表中没有 CHILD 记录 孩子和父母一对多之间存在双向链接,反之亦然。 在事务开始时,我将从数据库中获取父数据,以便父数据与持久性上下文相关联。 现在假设我正在创建孩子的新 POGO 对象并填充其数据。假设我将创建 20 个这样的对象,然后将孩子与父母和父母与孩子进行双向关联。 由于当我将父级与子级关联时,父级处于休眠状态,因此休眠将负责创建和建立链接。 现在假设我对会话上下文进行了刷新。 接下来我再创建 10 个孩子的 POGO 对象,并与 parent 进行相同的关联,并再次执行刷新。
事务结束后,当我检查数据库时,我发现前 20 个条目存在于数据库中,但它们与父级的关联不存在。但是对于最后添加的 10 个子对象,父对象的条目和关联都在那里。
当我在添加 20 到 10 之间的孩子之间删除冲洗时,我看到所有 30 都正确关联。我想知道为什么刷新会导致问题。
【问题讨论】:
-
请包含相关代码:Annotations, hbm.xml, ... 也许是双向的ManyToOne?你定义了级联吗?
-
嗨@greyfairer 有一个从父级到子级的双向一对多映射,反之亦然。级联类型为all
标签: java hibernate ejb sql-update flush