FetchMode和FetchType之间的区别

jay*_*att 27 hibernate jpa fetch

指定lazy = "true"和使用有fetch = "select" or "join"什么区别 ?哪一个优于另一个?

关于jayendra

kam*_*mil 30

假设我们有这样的实体:

@Entity
@Table
public class Parent {
    @Id
    private Long id;

    @OneToMany(mappedBy="parent", fetch = FetchType.EAGER)
    @Fetch(FetchMode.JOIN)
    private List<Child> child;    
    //getter setters
}


@Entity
@Table
public class Child {    
    @Id
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    private Parent parent;

    //getter setter
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,当获取Parent实体时,hibernate将child使用join 自动加载所有实体.另一方面,当您获取时Child,Parent除非您在代码中将其称为明确,否则将不会选择实体child.getParent().

FetchType(Lazy/Eager)告诉我们是否希望在代码中调用时急切地或懒惰地加载实体.

FetchMode(Select/Join)告诉我们是否希望我们的权利加载了额外的select或在一个查询中加入或subselect.


Vis*_*kia 24

FetchMode:它定义了howhibernate(使用哪种策略,例如Join,SubQuery等)将从数据库中获取数据.

FetchType:它定义了whetherhibernate是否会获取数据.

注意:FetchMode仅适用于FetchType = EAGER注释时.

  • FetchMode不仅适用于FetchType.EAGER.规则如下:a)如果未指定FetchMode,则默认为JOIN,FetchType正常工作; b)如果明确指定FetchMode.JOIN,则忽略FetchType并且查询始终是急切的,c)如果指定FetchMode.SELECT或FetchMode.SUBSELECT,FetchType.Type正常工作. (25认同)
  • 要补充@DawidStępień,如果您忘记“JOIN FETCH”所有“EAGER”关联,“Hibernate”将为每一个关联发出“辅助选择”,而这些关联又可以倾向于“N” +1 查询问题`。因此,您应该更喜欢“LAZY”关联。- [链接](https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/fetching/Fetching.html) (2认同)