java Hibernate:使用executeUpdate()的批删除未清除一级缓存
我的意图是使用executeUpdate()
执行单个删除,而不是通过session.delete()
循环,这是一种难以置信的聊天方式
我面临的问题是,通过执行executeUpdate()
,它不会从一级缓存中逐出现有的已删除实体
下面是一个非常简单的示例:-
final Session session = sessionFactory.getCurrentSession();
System.out.println("---------------------------------");
System.out.println("What's currently in 1st level cache");
System.out.println("---------------------------------");
for (Object o : session.getStatistics().getEntityKeys()) {
EntityKey entityKey = (EntityKey) o;
System.out.println(entityKey.getEntityName() + " -> " + entityKey.getIdentifier());
}
System.out.println("---------------------------------");
System.out.println("Ensure there are 3 project users");
System.out.println("---------------------------------");
checkArgument(session.createQuery("from ProjectUser").list().size() == 3);
System.out.println("---------------------------------");
System.out.println("Deleting all 3 project users");
System.out.println("---------------------------------");
checkArgument(session.createQuery("delete from ProjectUser").executeUpdate() == 3);
session.flush();
System.out.println("---------------------------------");
System.out.println("Latest state in 1st level cache");
System.out.println("---------------------------------");
for (Object o : session.getStatistics().getEntityKeys()) {
EntityKey entityKey = (EntityKey) o;
System.out.println(entityKey.getEntityName() + " -> " + entityKey.getIdentifier());
}
这是我看到的打印件:-
---------------------------------
What's currently in 1st level cache
---------------------------------
testHibernate.domain.ProjectUser -> 2
testHibernate.domain.ProjectUser -> 1
testHibernate.domain.User -> 1
testHibernate.domain.ProjectUser -> 3
testHibernate.domain.User -> 3
testHibernate.domain.Project -> 1
testHibernate.domain.User -> 2
---------------------------------
Ensure there are 3 project users
---------------------------------
Hibernate:
select
projectuse0_.projectUserId as projectU1_1_,
projectuse0_.datetime as datetime2_1_,
projectuse0_.projectId as projectI3_1_,
projectuse0_.userId as userId4_1_
from
projectUser projectuse0_
[TRACE] [BasicExtractor] [extract:74] - Found [1] as column [projectU1_1_]
[TRACE] [BasicExtractor] [extract:74] - Found [2] as column [projectU1_1_]
[TRACE] [BasicExtractor] [extract:74] - Found [3] as column [projectU1_1_]
---------------------------------
Deleting all 3 project users
---------------------------------
Hibernate:
delete
from
projectUser
---------------------------------
Latest state in 1st level cache
---------------------------------
testHibernate.domain.ProjectUser -> 2
testHibernate.domain.ProjectUser -> 1
testHibernate.domain.User -> 1
testHibernate.domain.ProjectUser -> 3
testHibernate.domain.User -> 3
testHibernate.domain.Project -> 1
testHibernate.domain.User -> 2
正如您所看到的,testHibernate.domain.ProjectUser
实体仍然在一级缓存中徘徊,即使它们已经被删除
我的问题是如何使用executeUpdate()
方法从一级缓存中清除已删除的实体?是否有任何官方文件解释这个问题
多谢各位
# 1 楼答案
这是我的解决方案,但它真的不整洁
BaseEntity只是我们所有实体的基类