在数据库模式中休眠二级缓存和ON DELETE CASCADE

Bat*_*ard 6 java hibernate foreign-keys second-level-cache

我们的Java应用程序有大约100个映射到数据库(SQL Server或MySQL)的类.我们使用Hibernate作为我们的ORM(使用XML映射文件).

我们FOREIGN KEY在数据库模式中指定约束.我们的大多数FOREIGN KEY约束也都指明了ON DELETE CASCADE.

我们最近开始启用Hibernate二级缓存(针对流行的实体和集合)来缓解一些性能问题.

自从我们启用了二级缓存后,性能得到了提升.但是我们也开始遇到ObjectNotFoundExceptions.

似乎发生了ObjectNotFoundExceptions,因为数据库正在删除Hibernate 下面的表行.例如,当我们Parent使用Hibernate 删除a 时,数据库模式将ON DELETE CASCADE发送给任何Child实体.这显然没有Hibernates知识,所以它没有机会更新二级缓存(并删除任何已删除的Child实体).

我们相信这个问题的解决方案是ON DELETE CASCADE从我们的数据库模式中删除(但保留FOREIGN KEYs).相反,我们需要配置Hibernate来删除Child正常删除SQL的依赖关系,这也将使Hibernate更新二级缓存.一些有限的测试表明这种方法似乎有效.

我想得到一些社区反馈.我们的问题是否有其他(更好的?)解决方案?其他人如何处理这种情况?通常,在使用ON DELETE CASCADEHibernate的数据库模式中应该考虑哪些权衡?

谢谢.

bwa*_*wok 2

如果您总是要通过程序进行删除,则需要取消数据库的约束,并告诉 hibernate 对象 ON DELETE CASCADE 来处理相关的事情。

另一方面,如果您有时要在 Java 应用程序中删除对象,有时要在数据库级别删除对象,那么您最终会得到奇怪的挂起数据。在这种情况下,您可能需要研究更复杂的方法。您不清楚是否是这种情况,因此这里不打算详细介绍。