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