有人可以解释一下hibernate映射文件中cascade = "evict"
的用法是什么。
映射文件摘录:
<set name="details" cascade="evict">
<key column="detailid"></key>
<one-to-many class="com.intialize.example.Details"/>
</set>
答案 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也会驱逐所有相关的细节