我们的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的数据库模式中应该考虑哪些权衡?
谢谢.