来自文档:
分离
该实体具有关联的标识符,但不再关联 使用持久化上下文(通常是因为持久化上下文 关闭或实例被驱逐出上下文)
这是否意味着hibernate会保留对所有持久性对象的引用? 但那会导致记忆舔。
或者它意味着实体具有与数据库中的实体对应的id,然后它将得出两个结论: 1)只能查询数据库。 2)如果三分之一的实体会从数据库中删除实体,则分离的实体可能会变为瞬态。
答案 0 :(得分:0)
当使用new()运算符首次在应用程序中创建实体时,它仍处于瞬态。当您通过调用Session.save将其与会话关联时,它可以移至持久状态( ) 方法。 当你关闭()会话或从会话中逐出()该对象时,它会转移到分离状态。 您可以通过调用Session.update()或Session.saveOrUpdate()方法再次将分离的对象移动到持久状态。
答案 1 :(得分:0)
我没有在文档中找到关于此的任何内容,但我相信它确实跟踪了分离的实体...例如,根据JPA规范,你有获取实体的情况(但它的懒惰关系不是)...如果你分离这个实体然后再次合并它,它认为关系被卸载,但是如果你把关系设置为null,那么在合并之后它也会被设置为null ...那么如果它如何区分它不保留分离的记录......在cascade.MERGE行为中也有一些情况可能会告诉它保留以前分离的实体的记录....再次这是我所期望的,没有文档
答案 2 :(得分:0)
saveOrUpdate()执行以下操作:
如果对象在此会话中已经存在,则不执行任何操作
如果与会话相关联的另一个对象具有相同的标识符, 引发异常
如果对象没有标识符属性,请保存()
如果对象的标识符具有分配给新对象的值 实例化的对象,将其保存()
如果对象是通过或进行版本控制的,则 版本属性值与分配给新属性的值相同 实例化的对象,将其保存()
否则update()对象
https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-saveorupdate
使用Spring Data JPA时,该策略几乎可以节省。