我们的 Java 应用程序有大约 100 个类映射到数据库(SQL Server 或 MySQL)。我们使用 Hibernate 作为我们的 ORM(带有 XML 映射文件)。
我们在数据库模式中指定FOREIGN KEY
约束。我们的大多数FOREIGN KEY
约束还指定ON DELETE CASCADE
.
我们最近开始启用 Hibernate 二级缓存(用于流行的实体和集合)来缓解一些性能问题。
自从我们启用二级缓存后,性能得到了提升。然而,我们也开始遇到 ObjectNotFoundExceptions。
似乎 ObjectNotFoundExceptions 正在发生,因为数据库正在删除Hibernate下的表行。例如,当我们Parent
用 Hibernate 删除一个时,数据库模式将ON DELETE CASCADE
指向任何Child
实体。这显然是在没有 Hibernates 知识的情况下发生的,因此它没有机会更新二级缓存(并删除任何已删除的Child
实体)。
我们相信解决这个问题的方法是ON DELETE CASCADE
从我们的数据库模式中删除(但保留FOREIGN KEY
s)。相反,我们需要配置 Hibernate 以Child
使用普通删除 SQL 删除依赖项,这也将使 Hibernate 更新 2 级缓存。一些有限的测试表明这种方法似乎有效。
我想获得一些社区对此的反馈。我们的问题有替代(更好的?)解决方案吗?其他人如何处理这种情况?ON DELETE CASCADE
一般来说,在带有 Hibernate 的数据库模式中使用时应该考虑哪些权衡?
谢谢。