В настоящее время мы мигрируем с JavaEE5 на JavaEE6 и используем JBoss 6.0.0 и JSF2. Для простоты этот пример построен на основе архетипа Maven: org.jboss.weld.archetypes:jboss-javaee6-webapp:1.0.1.CR2
Я добавил простые ленивые отношения к User
:
@NotNull @ManyToMany(fetch=FetchType.LAZY)
private List<Address> addresses;
Этот бин является частью архетипа maven, и я добавил несколько строк к retrieveAllMembersOrderedByName()
.
@RequestScoped
public class MemberListProducer {
@Inject private Logger log;
@Inject @MemberRepository
private EntityManager em;
private List<Member> members;
@Produces @Named
public List<Member> getMembers(){return members;}
@PostConstruct
public void retrieveAllMembersOrderedByName()
{
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> criteria = cb.createQuery(Member.class);
Root<Member> member = criteria.from(Member.class);
criteria.select(member).orderBy(cb.asc(member.get("name")));
members = em.createQuery(criteria).getResultList();
Member m1 = members.get(0);
log.info("Id: "+m1.getId());
Member m2 = em.find(Member.class, m1.getId());
log.info("Addr m1: "+m1.getAddresses().size()); // OK
log.info("Addr m2: "+m2.getAddresses().size()); // Error
}}
Как видите, List<Member>
извлекается CriteriaQuery, затем Member m1
берется из списка, а Member m2
явно загружается из того же EntityManager em
. Теперь интересная часть: m1.getAddresses().size()
работает, m2.getAddresses().size()
дает
15:41:32,910 ERROR [org.hibernate.LazyInitializationException]
failed to lazily initialize a collection of role: test.Member.addresses,
no session or session was closed: org.hibernate.LazyInitializationException:
failed to lazily initialize a collection of role:test.Member.addresses,
no session or session was closed
Кто-нибудь может объяснить это или знает, как решить эту проблему? Спасибо, Тор