Hibernate的第二级缓存和数据库模式中的删除级联
-
28-09-2019 - |
题
我们的Java应用程序大约有100个映射到数据库(SQL Server或MySQL)的类。我们将Hibernate用作ORM(带有XML映射文件)。
我们指定 FOREIGN KEY
我们的数据库架构中的约束。我们的大多数 FOREIGN KEY
约束也指定 ON DELETE CASCADE
.
最近,我们开始启用Hibernate第二级缓存(对于受欢迎的实体和集合)来减轻某些性能问题。
自从我们启用了第二级缓存以来,性能有所提高。但是,我们也开始遇到ObjectNotFoundExceptions。
似乎正在发生ObjectNotFoundExceptions,因为数据库正在删除表行 下 冬眠。例如,当我们删除一个 Parent
使用Hibernate,数据库模式将 ON DELETE CASCADE
去任何 Child
实体。这显然没有通知知识就会发生,因此它没有机会更新第二级缓存(并删除任何已删除 Child
实体)。
我们认为解决这个问题的解决方案是删除 ON DELETE CASCADE
从我们的数据库架构中(但请保留 FOREIGN KEY
S)。相反,我们需要配置Hibernate以删除 Child
具有普通删除SQL的依赖项,这也将使Hibernate更新第二级缓存。一些有限的测试表明,这种方法似乎起作用。
我想对此获得一些社区反馈。我们的问题有其他解决方案吗?其他人如何处理这种情况?通常,使用时应考虑的权衡是什么 ON DELETE CASCADE
在带有冬眠的数据库模式中?
谢谢。
解决方案
如果您始终要删除程序,则要从数据库中删除约束,并告诉Hibernate对象在Delete Cascade上以照顾相关的人。
另一方面,如果您有时会在Java应用中删除对象,有时在数据库级别中,您最终会得到奇怪的挂数据。在这种情况下,您可能需要研究一种更复杂的方法。.您尚不清楚是否是这种情况,因此在这里不会更详细地详细介绍。
其他提示
如果您正在使用 ON DELETE CASCADE
在您的数据库中,您需要告诉Hibernate,这样:
@OnDelete(action = OnDeleteAction.CASCADE)
这与
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
后者正在告诉Hibenrate关于内存关系的一些信息。第一个优化了数据库级别上的删除SQL语句。 Hibernate需要知道DB正在照顾删除孩子。
看看这个网站,以很好地解释这种机制:
http://eddii.wordpress.com/2006/11/16/hibernate-on-deletecascade-performance/
以及此功能开发人员的评论:
http://www.mail-archive.com/hibernate-devel@lists.sourceforge.net/msg03801.html