检查休眠中的独立实体

问题描述:

我只是想知道Hibernate如何识别对象是否是分离的实体。我没有要求任何具体的方法,只是想了解背后的机制。检查休眠中的独立实体

+0

基本上,每个会话都有一个包含该会话中所有实体的IdentityHashMap。 –

+0

我不确定这是个好问题。在StackOverflow上,你应该证明你已经努力了解自己。要回答这个问题的唯一方法是阅读Hibernate的源代码,以确切了解他们是如何做到的。我们中的任何一个人都可能会说或者说我们会怎么做,但是没有阅读源代码,没有人会知道答案。 Tuan,你有没有试过在源代码中发现自己?如果是这样,你有多远?当然,JB Nizet是对的,这可能是他们如何做到的,或者JB Nizet是一个Hibernate开发人员,而这正是他们如何做到的。 – DavidS

+1

我不是Hibernate开发人员,我查看了源代码。 –

从JBoss的文档:

独立式 - 一个脱管的实例是,一直坚持不懈, 一个对象,但它的Session已经被关闭。对象的引用仍然是 当然有效,并且分离的实例甚至可能在此状态下被修改为 。分离的实例可以在稍后的时间点重新附加到新的会话 ,使其(以及所有修改) 再次持久。此功能可为需要用户思考时间的长时间运行的工作单元启用编程模型。我们称它们为应用程序事务,即从用户的角度 开始的一个工作单元。

,因为Hibernate基本上跟踪会话和连接对象。 任何与该会话关联的对象都将被分离,并变得像其他任何POJO一样。

那么Hibernate并不为:

  1. 呼吁session.evict()的对象引用或session.clear()从会议中删除的对象。
  2. Hibernates持久性管理器依赖于存在的标识符来确定对象的状态。如果一个对象有一个标识符,那么这个对象就是Persistent,如果它不属于一个会话,那么它是DETACHED
  3. 打开新会话后,可以将分离的对象重新关联并同步到数据库。
  4. 调用上的独立式对象引用session.update()session.saveOrUpdate()转变的分离对象持久状态
  5. 当一个独立对象是重新挂接数据库更新对象的当前状态;以包括处于分离状态时所做的更改。

一个很好的参考可以找到here

+0

@TimBiegeleisen是的,对不起,正在不断编辑。现在更新了答案。 –