当前位置: 首页 > 面试题库 >

休眠二级缓存和数据库架构中的ON DELETE CASCADE

明利
2023-03-14
问题内容

我们的Java应用程序有大约100个类映射到数据库(SQL Server或MySQL)。我们使用Hibernate作为我们的ORM(带有XML映射文件)。

我们FOREIGN KEY在数据库架构中指定约束。我们的大多数FOREIGN KEY约束条件也都指定了ON DELETE CASCADE

我们最近开始启用Hibernate 2级缓存(适用于流行的实体和集合),以缓解一些性能问题。

自从启用第二级缓存以来,性能得到了提高。但是,我们也开始遇到ObjectNotFoundExceptions。

似乎正在发生ObjectNotFoundExceptions,因为数据库正在删除Hibernate 下的
表行。例如,当我们Parent使用Hibernate 删除A 时,数据库架构将ON DELETE CASCADE移至任何Child实体。这显然是在没有Hibernates知识的情况下发生的,因此它没有机会更新第二级缓存(并删除任何已删除的Child实体)。

我们认为解决此问题的方法是ON DELETE CASCADE从数据库架构中删除(但保留FOREIGN KEYs)。相反,我们需要配置Hibernate以Child使用常规的删除SQL
删除依赖项,这也将使Hibernate更新第二级缓存。一些有限的测试表明,这种方法似乎有效。

我想对此获得一些社区反馈。是否有替代(更好的)解决方案来解决我们的问题?别人如何处理这种情况?通常,ON DELETE CASCADE在与Hibernate一起使用数据库模式时应考虑哪些折衷?

谢谢。


问题答案:

如果您总是要通过程序进行删除,则希望从数据库中删除约束,并将hibernate对象告知ON DELETE CASCADE来照顾相关人员。

另一方面,如果您有时要在Java应用程序中以及有时在数据库级别删除对象,则最终会得到奇怪的挂起数据。在这种情况下,您可能需要研究一种更复杂的方法。您不清楚是否是这种情况,因此这里不再赘述。



 类似资料:
  • 问题内容: 我正在使用Spring + JPA + Hibernate。我正在尝试启用Hibernate的二级缓存。在我的春天,我有: 运行时出现错误: 所以有人抱怨我没有启用二级缓存。我试图通过添加到我的启用它: 但是仍然没有喜悦。我还尝试将其添加到ehcache.xml中: 但这仍然行不通。将更改为也无济于事: 我的实体类被注释为使用缓存 那么,如何启用二级缓存? 编辑: 这是在bean下:

  • 问题内容: 我已经读到,使用hibernate的二级缓存,它可以通过减少对数据/对象检索的数据库命中次数来提高应用程序性能。 但是,hibernate如何确保二级缓存与数据库中的数据保持最新。 例如: 假设下面的类是实体并且持久化到数据库中。 现在,如果我们启用了二级缓存,我知道如果打开不同的会话,则每个会话都将命中二级缓存以获取对象值。 现在,如果数据库中的数据发生更改(例如,对于ID = 1的

  • 问题内容: 一级缓存与hibernate中的查询缓存是否不同?我看过有关第一级和查询缓存的文章,所以我很困惑。 问题答案: 默认情况下,第一级缓存处于启用状态,并且基于每个会话。默认情况下,查询缓存未启用,它在多个会话之间共享,应始终与二级缓存一起使用。 要启用查询缓存,应使用以下属性:

  • 问题内容: 我正在开发将来的多租户Web应用程序,它将需要支持数千个用户。该应用程序是在基于Java的Play之上构建的!使用JPA / Hibernate和postgreSQL的MVC框架。 我看了盖伊·纳尔(Guy Naor)关于在Rails中编写多租户应用程序的演讲,其中他谈到了几种多租户方法(数据隔离度随着列表的增加而降低): 每个客户都有一个单独的数据库 一个为每个客户提供单独的架构和表

  • 问题内容: 在我的Spring驱动的应用程序中,我使用Hibernate(4.2.15.Final)和EhCache(2.6.9)作为第二级缓存,在标准的持久层中进行了设置。 一切正常。但是,将条目放入第二级缓存有时会花费一些时间。 我已经在一个显式文件中配置了域模型类的缓存(我没有配置默认缓存): 在持久性上下文启动时,我收到以下INFO消息记录: 以及执行期间的以下警告 AFAIK 必须调整放

  • 问题内容: 我知道一个事实,它是 Hibernate 使用的一级缓存,一旦我们从中检索到一个实体,就会从而不是从DB中获取对具有 相同标识符 的 同一实体 的后续get调用,直到is Open 为止。 话虽如此,我对休眠如何将第一级缓存与数据库同步感到怀疑吗?考虑以下情形 所以我的问题是 由于是从一级缓存中提取的,因此有更新的值吗? 如果在会话打开时有人直接更新DB并修改User对象,那么是否与D