一尘不染

在Hibernate中重新附加分离对象的正确方法是什么?

java

我遇到一种情况,我需要将分离的对象重新附加到hibernate会话,尽管会话中可能已经存在相同标识的对象,这将导致错误。

现在,我可以做两件事之一。

  1. getHibernateTemplate().update( obj ) 当且仅当hibernate会话中不存在对象时,此方法才有效。当以后需要时,将引发异常,指出具有给定标识符的对象已存在于会话中。
  2. getHibernateTemplate().merge( obj ) 仅当hibernate会话中存在对象时,此方法才有效。如果我以后使用该对象,则当我需要该对象进入会话时,将引发异常。

在这两种情况下,如何将会话附加到对象上?我不想使用异常来控制此问题的解决方案的流程,因为必须有一个更优雅的解决方案…


阅读 274

收藏
2020-03-18

共1个答案

一尘不染

因此,似乎没有办法在JPA中重新附加陈旧的独立实体。

merge()会将过时的状态推送到数据库,并覆盖所有中间更新。

refresh() 不能在独立实体上调用。

lock() 无法在分离的实体上调用,即使可以,也确实将其重新连接,并使用参数LockMode.NONE调用“ lock”,这意味着你正在锁定而不是锁定是API设计中最违反直觉的部分我见过的。

所以你被困住了。有一种detach()方法,但是没有attach()reattach()。你无法使用对象生命周期中一个明显的步骤。

从有关JPA的类似问题的数量来看,即使JPA确实声称拥有一个连贯的模型,但它肯定与大多数程序员的思维模型不符,大多数程序员被诅咒浪费了很多时间试图理解如何获得JPA做最简单的事情,并最终在整个应用程序中使用缓存管理代码。

似乎唯一的方法是丢弃陈旧的分离实体,并执行具有相同ID的查找查询,这将影响L2或DB。

2020-03-18