Hibernate如何区分瞬态和分离的实体?

时间:2018-01-24 15:28:23

标签: java hibernate jpa sessionfactory

来自文档:

  

分离

     

该实体具有关联的标识符,但不再关联   使用持久化上下文(通常是因为持久化上下文   关闭或实例被驱逐出上下文)

这是否意味着hibernate会保留对所有持久性对象的引用? 但那会导致记忆舔。

或者它意味着实体具有与数据库中的实体对应的id,然后它将得出两个结论: 1)只能查询数据库。 2)如果三分之一的实体会从数据库中删除实体,则分离的实体可能会变为瞬态。

3 个答案:

答案 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时,该策略几乎可以节省。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.entity-persistence.saving-entites.strategies