我们的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 KEYS)。相反,我们需要配置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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top