在hibernate hbm文件中cascade = evict的用法是什么?

时间:2017-10-11 18:39:13

标签: hibernate hibernate-mapping

有人可以解释一下hibernate映射文件中cascade = "evict"的用法是什么。

映射文件摘录:

<set name="details" cascade="evict">
  <key column="detailid"></key>
  <one-to-many class="com.intialize.example.Details"/>
</set>

3 个答案:

答案 0 :(得分:1)

Evict与DETACH相同,不推荐使用。

请参阅API文档 https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/annotations/CascadeType.html#EVICT

这里有一篇关于级联类型的优秀文章: https://vladmihalcea.com/a-beginners-guide-to-jpa-and-hibernate-cascade-types/

来自文档

5.12。驱逐实体 调用flush()方法时,实体的状态将与数据库同步。如果您不希望发生此同步,或者您正在处理大量对象并需要有效管理内存,则可以使用evict()方法从第一级缓存中删除对象及其集合。 / p>

示例329.从EntityManager中分离实体

for(Person person : entityManager.createQuery("select p from Person p", Person.class)
        .getResultList()) {
    dtos.add(toDTO(person));
    entityManager.detach( person );
}

示例330.从Hibernate会话中删除实体

Session session = entityManager.unwrap( Session.class );
for(Person person : (List<Person>) session.createQuery("select p from Person p").list()) {
    dtos.add(toDTO(person));
    session.evict( person );
}

希望这有帮助。

答案 1 :(得分:0)

来自Hibernate Javadocs:

  

如果关联与cascade="evict"映射,则此操作[evict()]会级联到关联的实例。

答案 2 :(得分:0)

使用evict,你告诉hibernate从第一级缓存上下文中删除一个实体,就像所有其他操作(persist,update,remove等等)可以级联到特定关系的所有子节点一样。

因此,当您在定义此关系的实体上调用evict时

<set name="details" cascade="evict">
  <key column="detailid"></key>
  <one-to-many class="com.intialize.example.Details"/>
</set>

hibernate也会驱逐所有相关的细节