我一直在四处寻找并了解hibernate如何在内部确定对象是否已分离。试图看到冬眠的代码,但我无法弄清楚。在stackoverflow中看到过一些线程,但是所有这些线程都讨论了我们如何在一个程序中确定一个对象是否已经分离。但我想要了解的是hibernate如何在内部识别一个分离的对象。后面的算法是什么做这个鉴定的场景??
答案 0 :(得分:3)
当然,如果实体被管理(即附加到当前会话,那么它不会被分离)。关键部分是区分瞬态(即未管理的实体实例,尚未存在于数据库中的实体实例)和分离实体(即未管理但应该存在的实体)已经在数据库中。)
确定实体是分离的还是瞬态的算法的主要部分是AbstractEntityPersister.isTransient()
。
基本上,如果它具有空标识符或空乐观锁定版本属性(即用@Version
注释的属性),那么它被认为是瞬态的。
还有其他细微之处,但如果您使用自动生成的标识符,并且标识符不为null,则Hibernate会将其视为分离的实体。如果使用分配的标识符,则需要检查数据库(除非您还具有版本属性)。这是使用自动生成标识符的另一个好理由。