Гибернация загружается охотно даже после того, как помечена как ленивая нагрузка - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующие отношения сущностей.

  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)

Я вижу запрос гибернации, который присоединяется к группе пользователей, пользователю, пользователю. Мне нужен только запрос группы пользователей, так как user и userRole оба помечены 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=?

1 Ответ

0 голосов
/ 18 января 2019

По ссылке

С fetch = "join" в коллекции или однозначной ассоциации сопоставляя, вы фактически избежите второго SELECT (следовательно, делая ассоциация или коллекция не ленивый)

...