猿问

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

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

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

  1. getHibernateTemplate().update( obj ) 当且仅当休眠会话中不存在对象时,此方法才有效。当以后需要时,会抛出异常,说明会话中已经存在具有给定标识符的对象。

  2. getHibernateTemplate().merge( obj ) 仅当休眠会话中存在对象时,此方法才有效。如果我以后使用该对象,则当我需要该对象进入会话时,将引发异常。

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


吃鸡游戏
浏览 659回答 3
3回答

互换的青春

如果您确定您的实体尚未被修改(或者如果您同意任何修改将丢失),则可以使用锁定将其重新连接到会话。session.lock(entity, LockMode.NONE);它不会锁定任何内容,但是会从会话缓存中获取实体,或者(如果未在其中找到)从数据库读取实体。当您从“旧”(例如HttpSession)实体导航关系时,防止LazyInitException非常有用。您首先要“重新附加”实体。使用get也可能会起作用,除非您继承映射时(继承已在getId()上引发异常)。entity = session.get(entity.getClass(), entity.getId());
随时随地看视频慕课网APP
我要回答