休眠 hbm 文件中 cascade=evict 的用法是什么

what is the usage of cascade=evict in hibernate hbm file

谁能解释一下休眠映射文件中 cascade = "evict" 的用法。

映射文件摘录:

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

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() 方法从一级缓存中删除对象及其集合。

示例 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 );
}

希望对您有所帮助。

来自 Hibernate Javadocs:

This operation [evict()] cascades to associated instances if the association is mapped with cascade="evict".

使用 evict,您告诉 hibernate 从一级缓存上下文中删除一个实体,并且像所有其他操作(持久化、更新、删除等...)一样,可以级联到特定关系的所有子级...

因此,当您对定义此关系的实体调用逐出时

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

hibernate 也将驱逐所有关联的详细信息