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