繁体   English   中英

如何设置 Hibernate 的默认获取类型?

[英]How can I set the default fetch type for Hibernate?

由于安全审计将其导入的一半代码标记为安全风险,我有一个糟糕的旧 Java Enterprise 程序,我正试图将其引入当前十年。 正如你们中的一些人所知,在 2010 年中期的某个时候,Hibernate 将其默认值从所有内容的 LAZY 加载更改为几乎所有内容的 EAGER 加载。

问题是,这会破坏这个程序。 假设一切都是延迟加载,它被注释了,所以唯一的注释是它想要获取 EAGER 的东西,嗯,这并不多。 最终结果是连接数量的巨大增加,这导致性能急剧下降,因为大多数连接实体没有用于典型的批处理操作。 例如,用户字段是必要的,以便按用户查询。 但是报告的用户已经在处理用户记录的循环的顶部获取,因此在查询中添加一个 JOIN 以急切地获取每条记录的用户只会使报告变慢。

我的大多数关系都没有注释为懒惰获取,而且有很多 我可以手动进入,并且费力地,一个一个地注释它们以便懒惰地获取。 或者我可以将 Hibernate 的默认设置改回编写此程序时的默认设置。 由于显而易见的原因,我显然更喜欢后者——我真的不想花更多的时间来更新这个古老的代码库,因为我们正在编写它的替代品。

有一个基于您在定义实体时提供的映射的默认获取计划。

  • 默认情况下,JPA @ManyToOne 和 @OneToOne 注释是 EAGERly 获取的,而 @OneToMany 和 @ManyToMany 关系被认为是 LAZY。
  • 这是默认策略,Hibernate 不会神奇地优化您的对象检索,它只会执行指示执行的操作

正如这个答案中指出的那样https://stackoverflow.com/a/57586036/19351325不幸的是,无法更改默认提取类型,它将始终是:

OneToMany: LAZY
ManyToOne: EAGER
ManyToMany: LAZY
OneToOne: EAGER

但是您可以使用简单的正则表达式来自动添加延迟获取。 在 Intellij Idea 中使用这些组合:ctrl+shft+r 或 cmd+shft+r,以及以下正则表达式:@ManyToOne$ 或 @OneToOne$,用于替换部分:@ManyToOne(fetch = FetchType.LAZY) 和 @OneToOne (fetch = FetchType.LAZY) 相应地。

如果您已经在这些注释中添加了一些属性,您可以修改您的搜索正则表达式。 无论如何,它会比手动完成所有操作更快

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM