Hibernate二级缓存和数据库模式中的ON DELETE CASCADE

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

2
如果您总是通过程序删除数据,您需要解除数据库的约束并告诉Hibernate对象ON DELETE CASCADE来处理相关的数据。
另一方面,如果您有时会在Java应用程序中删除对象,有时会在数据库层面上进行删除,那么您可能会遇到奇怪的挂起数据。在这种情况下,您可能需要考虑更复杂的方法。由于您没有明确说明情况,因此不会在此处进一步详细介绍。

好的观点。我们应用程序中的Java代码是唯一访问和更新数据库的方式。这种情况不太可能改变。因此,删除ON DELETE CASCADEs不会影响任何其他应用程序/脚本等。 - Bat Fastard
那就通过 Hibernate 去做吧。 - bwawok
为什么不将数据库的 ON DELETE CASCADE 与 hibernate 的级联删除结合使用?当数据库删除它时,hibernate 尝试删除被级联删除的子项,但没有要删除的内容。所以什么也不应该发生,或者我错了吗? - djmj
我认为这可能是竞态条件。Hibernate发送了删除Parent和Children A、B、C的请求。数据库先删除了Parent A,然后尝试删除Children A、B、C。Hibernate删除这3个对象失败了。那么Hibernate会怎么做呢?会报错吗?还是静默异常?不确定...看起来好像不应该让两个人负责删除同一个东西。 - bwawok
嗯,我认为没有问题,必须再次评估。是否可以强制第二级缓存重新检查实体以进行更新或删除,可能在拦截器内?我目前正在自己解决这个问题,我不想删除我的数据库级联效果。使用拦截器或EntityListener可能可以实现实施“CASCADE”或“SET NULL”。将会检查此事。 - djmj

1
如果您在数据库中使用了 ON DELETE CASCADE,您需要像这样告诉 Hibernate:
@OnDelete(action = OnDeleteAction.CASCADE)

这与

不同。
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

后者是告诉Hibernate关于内存关系的一些内容。第一个优化数据库级别上的删除SQL语句。Hibernate需要知道数据库正在处理删除子项。请查看此网站以获得有关此机制的良好解释:

http://eddii.wordpress.com/2006/11/16/hibernate-on-deletecascade-performance/

还有这个功能的开发者的评论:

http://www.mail-archive.com/hibernate-devel@lists.sourceforge.net/msg03801.html


二级缓存是否能正确地与 @OnDelete 一起使用?所有我所找到的信息都是:不行 - http://stackoverflow.com/a/21155878/548473。 - Grigory Kislin
1
它可以工作!它可以使用缓存,没有任何问题。但是像往常一样:您需要理解它正在做什么以及Hibernate的期望。 - Janning Vygen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接