我们的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时应考虑哪些权衡?谢谢。
我们在数据库模式中指定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时应考虑哪些权衡?谢谢。
ON DELETE CASCADE
与 hibernate 的级联删除结合使用?当数据库删除它时,hibernate 尝试删除被级联删除的子项,但没有要删除的内容。所以什么也不应该发生,或者我错了吗? - djmj