Почему Lazy Inilialization Proxy использует JOIN FETCH в JPQL - PullRequest
0 голосов
/ 14 февраля 2020

Ниже приведены мои модели ролей и разрешений с сопоставлениями .... наиболее очевидный дизайн

@Cacheable
@Cache(region="roles", usage=CacheConcurrencyStrategy.READ_WRITE)
@Entity
@Table(name="ROLE")
public class Role implements Serializable{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="_ID")
    private String _id;

    @Column(name="NAME")
    private String name;

    @Column(name="DESCRIPTION")
    private String description;

    @Column(name="PROFILE_ID")
    private String profileId;

    @Cache(region="permissions", usage=CacheConcurrencyStrategy.READ_WRITE)
    @ManyToMany
    @JoinTable(name="ROLE_PERMISSION", joinColumns={@JoinColumn(name="ROLE_ID")},
    inverseJoinColumns={@JoinColumn(name="PERMISSION_ID")})
    private List<Permission> permissions;
}

@Cacheable
@Cache(region="permissions", usage=CacheConcurrencyStrategy.READ_ONLY)
@Entity
@Table(name="PERMISSION")
public class Permission implements Serializable{

    @Id
    @Column(name="_ID")
    private int _id;

    @Column(name="NAME")
    private String name;    

}

В некоторых случаях мне нужно загрузить роль вместе со всеми ее разрешениями, т. Е. Когда profileId соответствует данному идентификатору из интерфейса И мой запрос выглядит следующим образом с JOIN FETCH

String sql = "select distinct r from Role r LEFT JOIN FETCH r.permissions where r.profileId = :profileId order by r.name";
        return entityManager.createQuery(sql, Role.class).setParameter("profileId", profileId)
                .setHint(HINT_CACHE, true).getResultList();

Все хорошо до этого момента и использовал запрос chache ... но я вижу, что LazyProxy создается, когда я наблюдаю результат и выдает Исключение при передаче этого результата в пользовательский интерфейс

enter image description here

Во всем нашем сообществе Stackoverflow я вижу предложения использовать JOIN FETCH для активной загрузки ассоциаций. Но я понимаю, почему все еще создается Прокси? Может кто-нибудь объяснить это? Должен ли я go с @ Proxy (lazy = false) , где мы не можем загрузить данные на основе запроса?

...