LazyInitializationException in @RequestScoped Bean after explicit EntityManager.find

We are currently migrating from JavaEE5 to JavaEE6 and are using JBoss 6.0.0 and JSF2. For simplicity, this example is built and based on the Maven archetype:org.jboss.weld.archetypes:jboss-javaee6-webapp:1.0.1.CR2

I added a simple LAZY relation to User:

@NotNull @ManyToMany(fetch=FetchType.LAZY)
private List<Address> addresses;

This bean is part of the maven archetype, and I added a few lines to 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
    }}

As you can see, List<Member>CriteriaQuery is retrieved, then Member m1taken from the list, and Member m2explicitly loaded from the same EntityManager em. Now the interesting part: it m1.getAddresses().size()works, m2.getAddresses().size()it gives

    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

Can someone explain this or know how to solve this problem? Thanks Thor

+3
source share
3 answers

- . , Hibernate .

Open Session View Filter, Hibernate , .

.

http://community.jboss.org/wiki/OpenSessionInView

Spring Framework, OpenSessionInViewFilter class.

, .

0

, ? , , , . . - , , . ?

0

You can dynamically import related objects using the code below, which has standard lazy initialization:

criteria.setFetchMode ("addresses", FetchMode.JOIN);

0
source

All Articles