我们的Java应用程序有大约100个类映射到数据库(SQL Server或MySQL)。我们使用Hibernate作为我们的ORM(带有XML映射文件)。
我们FOREIGN KEY在数据库架构中指定约束。我们的大多数FOREIGN KEY约束条件也都指定了ON DELETE CASCADE。
FOREIGN KEY
ON DELETE CASCADE
我们最近开始启用Hibernate 2级缓存(适用于流行的实体和集合),以缓解一些性能问题。
自从启用第二级缓存以来,性能得到了提高。但是,我们也开始遇到ObjectNotFoundExceptions。
似乎正在发生ObjectNotFoundExceptions,因为数据库正在删除Hibernate 下的 表行。例如,当我们Parent使用Hibernate 删除A 时,数据库架构将ON DELETE CASCADE移至任何Child实体。这显然是在没有Hibernates知识的情况下发生的,因此它没有机会更新第二级缓存(并删除任何已删除的Child实体)。
Parent
Child
我们认为解决此问题的方法是ON DELETE CASCADE从数据库架构中删除(但保留FOREIGN KEYs)。相反,我们需要配置Hibernate以Child使用常规的删除SQL 删除依赖项,这也将使Hibernate更新第二级缓存。一些有限的测试表明,这种方法似乎有效。
我想对此获得一些社区反馈。是否有替代(更好的)解决方案来解决我们的问题?别人如何处理这种情况?通常,ON DELETE CASCADE在与Hibernate一起使用数据库模式时应考虑哪些折衷?
谢谢。
如果您总是要通过程序进行删除,则希望从数据库中删除约束,并将hibernate对象告知ON DELETE CASCADE来照顾相关人员。
另一方面,如果您有时要在Java应用程序中以及有时在数据库级别删除对象,则最终会得到奇怪的挂起数据。在这种情况下,您可能需要研究一种更复杂的方法。您不清楚是否是这种情况,因此这里不再赘述。