我遇到了这样的情况,我需要将分离的对象重新附加到hibernate会话,尽管会话中可能已经存在相同标识的对象,这将导致错误。
现在,我可以做两件事之一。
getHibernateTemplate()。更新(obj)
当且仅当对象在hibernate会话中还不存在时,这才有效。当我以后需要它时,抛出异常,声明具有给定标识符的对象已经存在于会话中。
getHibernateTemplate()。合并(obj)
当且仅当hibernate会话中存在对象时,此操作才有效。如果稍后使用此方法,则在需要对象处于会话中时抛出异常。
对于这两种场景,我如何将会话附加到对象?我不想使用异常来控制这个问题解决方案的流程,因为一定有更优雅的解决方案……
因此,似乎没有办法在JPA中重新附加一个过时的分离实体。
merge()会将过期状态推送到DB,
并覆盖任何中间更新。
不能在分离实体上调用Refresh()。
不能在分离实体上调用Lock (),
即使它可以,而且它确实重新连接了实体,
使用参数LockMode调用lock。没有'
这意味着你在锁定,但不是锁定,
是我见过的最违反直觉的API设计。
所以你陷入了困境。
有一个detach()方法,但没有attach()或reattach()。
对象生命周期中的一个明显步骤对您来说是不可用的。
根据关于JPA的类似问题的数量判断,
似乎即使JPA声称有一个一致的模型,
它肯定不符合大多数程序员的思维模式,
谁被诅咒浪费了很多时间试图理解
如何让JPA做最简单的事情,并以缓存结束
管理代码遍布他们的应用程序。
要做到这一点,似乎唯一的方法就是抛弃你陈旧的超然实体
并使用相同的id执行find查询,这将命中L2或DB。
Mik