【问题标题】:How is it possible for the detached entity to be a persistent object in hibernate?分离的实体如何成为休眠中的持久对象?
【发布时间】:2015-06-11 17:22:11
【问题描述】:
我阅读了有关瞬态、持久和分离的内容。似乎大部分内容都是直截了当的。我无法克服的是,当我们使用session.close() 时,已经在一级缓存中的实体对象被删除或清除,在我看来,没有机会将实体或对象恢复为持久状态.但是后来我从不同的来源看到或读到的是,分离的实体仍然可以在以后重新附加到新会话。关闭会话后清除一级缓存怎么可能?
【问题讨论】:
标签:
java
hibernate
session
jdbc
persistence
【解决方案1】:
我想向您保证,这并不复杂。简直……
- 我们可以在一个
session(会话实例)中加载一个实体 - 并关闭这样的session,同时保持对加载的实体的引用。一旦session 关闭,entity 就会分离
- 我们可以打开新的
session (不同的会话实例) - 并重新附加该实体。然后,我们就可以保留同时进行的更改。
就是这样。来自文档的更多详细信息:
许多应用程序需要在一个事务中检索一个对象,将其发送到 UI 层进行操作,然后将更改保存在一个新事务中。在高并发环境中使用这种方法的应用程序通常使用版本化数据来确保“长”工作单元的隔离。
...
如果您确定会话不包含具有相同标识符的已持久实例,请使用update()。如果您想在不考虑会话状态的情况下随时合并您的修改,请使用merge()。
所以,这里的重点是……加载有session 的实体 不是瞬态的。它已经坚持了。一旦会话关闭,它就会分离。但可以稍后重新参加,参加另一个会议