首页 > 解决方案 > 即使标记为延迟加载,Hibernate 也会急切地加载

问题描述

我有以下实体关系。

  1. 一个用户有多个用户组。
  2. 每个用户组有一个用户角色。

实体及其关系映射如下:

public class UserGroup {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
    @Fetch(FetchMode.JOIN)
    private User user;

    @OneToOne(mappedBy = "userGroup", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @Setter(AccessLevel.NONE)
    @Fetch(FetchMode.JOIN)
    private UserRole userRole;

}
public class User {

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    @Fetch(FetchMode.JOIN)
    private Set<UserGroup> userGroups;
}
public class UserRole {

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_group_id")
    @Fetch(FetchMode.JOIN)
    private UserGroup userGroup;

}

当我使用以下内容执行简单的查找查询时:

userGroupDao.get(id)

我看到一个休眠查询,它加入了用户组、用户、用户角色。我只想要 userGroup 查询,因为useruserRole都标有FetchType.LAZY。这里有初始化问题吗?

这是休眠查询:

Hibernate: /* criteria query */ select ...<list of columns>... from user_groups this_ inner join users storeduser2_ on this_.user_id=storeduser2_.user_id left outer join user_roles storeduser3_ on this_.id=storeduser3_.user_group_Id where this_.id=?


Hibernate: select ...<list of columns>... user_groups usergroupn0_ left outer join user_roles storeduser1_ on usergroupn0_.id=storeduser1_.user_group_Id where usergroupn0_.user_id=?

标签: hibernatelazy-loading

解决方案


根据链接

在集合或单值关联映射上使用 fetch="join",您实际上将避免第二个 SELECT(因此使关联或集合非惰性)


推荐阅读