FetchType.LAZY+@Fetch(FetchMode.JOIN)和fetch = FetchType.EAGER区别

新手上路,请多包涵

fetch = FetchType.LAZY加@Fetch(FetchMode.JOIN),和fetch = FetchType.EAGER有什么区别?
例如:

@OneToMany(fetch =FetchType.LAZY)
@Fetch(FetchMode.JOIN)

@OneToMany(fetch=FetchType.EAGER)

有什么区别?分别在什么情形下使用?

阅读 4.2k
1 个回答
新手上路,请多包涵

FetchType.EAGER 是急加载。从数据库获取对象信息时,定义为急加载的属性会立马从数据库加载出来。
FetchType.LAZY 是懒加载。从数据库获取对象信息时,定义为懒加载的属性不会立马从数据库加载出来,而是在用到的时候再加载。

比如,有一个实体 Car,其中有 id、name 等属性,还关联着另一个实体 Engine。

private Long id;
private Long name;
private Engine engine;

如果 engine 字段用的是 FetchType.EAGER,那么 jpa 在加载 id、name 等属性的时候,会一起将 engine 加载出来。
如果 engine 字段用的是 FetchType.LAZY,那么 jpa 在加载 id、name 等属性时并不会一起将 engine 加载出来,而是等到用到的时候,如使用 new Car().getEngine() 时,才将 engine 从数据库中加载出来。

一般来说,如果一个实体属性不是需要被经常用到,用 FetchType.LAZY 即可;如果需要经常用到,就用 FetchType.EAGER。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题