Java Hibernate:Clean collection';在级联删除项目时缓存第二级

Java Hibernate:Clean collection';在级联删除项目时缓存第二级,java,hibernate,caching,cascade,second-level-cache,Java,Hibernate,Caching,Cascade,Second Level Cache,我有一个问题,Hibernate没有为级联删除的项目集合更新二级缓存 细节 假设我们有一个对象父对象,它具有子对象的Parent.myChildren集合。 现在我们还有对象Humans和Humans.myAllHumans集合,所有父对象和子对象都在该集合中。 现在,我们将session.delete(parent)和所有子项从数据库中级联删除,但Humans.myAllHumans集合的缓存不会更新!它仍然假设级联删除的对象在数据库中,我们在稍后尝试对集合进行重新整理时遇到以下异常: org

我有一个问题,Hibernate没有为级联删除的项目集合更新二级缓存

细节 假设我们有一个对象父对象,它具有子对象的Parent.myChildren集合。 现在我们还有对象Humans和Humans.myAllHumans集合,所有父对象和子对象都在该集合中。
现在,我们将session.delete(parent)和所有子项从数据库中级联删除,但Humans.myAllHumans集合的缓存不会更新!它仍然假设级联删除的对象在数据库中,我们在稍后尝试对集合进行重新整理时遇到以下异常:
org.hibernate.ObjectNotFoundException:不存在具有给定标识符的行:[foo.Child#751]

尝试过的方法 1) 我已经尝试过SessionFactory.executeCollection()方法,但据我所知,它不是事务安全的,并且会从二级缓存中硬删除数据,我不希望这样

2) 我还可以手动(通过编程)从myAllHumans集合中删除每个对象。在这种情况下,hibernate会更新二级缓存。我希望避免这种方法,因为它只会使级联删除功能变得无用

预期 我希望hibernate足够智能,能够自动更新集合的缓存。可能吗?

我现在正在使用EhCache,您认为使用另一个缓存实现或配置EhCache会有帮助吗?

问题是Hibernate实际上并没有执行删除操作。数据库将其作为外键关系的一部分来执行,因此Hibernate永远不会看到所有可能被删除的对象,因此,无法更新在任何情况下都有效的缓存


我认为最好的办法是在删除时刷新缓存(或缓存的一部分)。

通常Hibernate需要对对象进行政治上不正确的刷新才能重新加载cahe

重要的是EhCache如何处理惰性属性。我发现集合的lazy属性没有设置,cahe不会刷新对象


在您的情况下,如果humanity属性的Humans集设置为lazy=true(默认选项),则如果对象被激活,ehcache不会刷新它。尝试将humans和children集合的lazy属性设置为false

我一直在努力解决另一个需要从缓存中删除集合的问题,我已经找到了一些解决方案。我不知道是否有可能在级联删除时自动更新集合的缓存,但如果您尝试了SessionFactory.ReceiveCollection()并且成功了,我认为此解决方案可以是事务安全的,并且也可以:

if(MYCOLLECTION instanceof AbstractPersistentCollection)

((AbstractPersistentCollection)MYCOLLECTION).dirty()

这里我没有使用on delete=“cascade”(即数据库级cascade),而是使用cascade=“delete”(即hibernate必须递归调用“delete”,不是吗?)和关于“flush”。最后我确实提交了,不是强制刷新吗?你看到Hibernate在日志中发出了大量的删除吗?但是Hibernate可以知道实体是否将通过级联删除。我仍在等待确认他使用了正确的设置,并且确实看到Hibernate发出了
DELETE
语句。如果他这样做了,那么他可能需要刷新
Humans
实例,因为它过时了。我想我的问题案例可以简化。假设我只调用“session.delete(child)”,如何确保Parent.myChildren二级缓存同步?如果它说
不存在具有给定标识符的行
,则表明未更新的是查询缓存。。。您使用的是查询缓存还是普通的二级缓存?请看一看相同的问题: