[jboss-user] [EJB 3.0] - Re: failed to lazily initialize a collection of role:

bcowdery do-not-reply at jboss.com
Fri May 8 17:31:07 EDT 2009


Generally, an Entity bean is maintained in an "attached" state as long as the transaction is active. Since most implicit transactions begin and end with an the EJB method call your entity becomes "detached" once the invoked EJB method reaches its end. This means you should do all your lazy loading when you fetch the object.

For example:

  | @Stateless
  | public class MyDAO { 
  |     @PersistenceContext
  |     EntityManager em;
  | 
  |     // transaction begins
  |     public List<Entity> fetchEntity(Long id) {
  |         List<Entity> results = em.createQuery("select e from Entity where e.id = :id").setParameter("id", 1L).getResultList();
  | 
  |         // lazy load something from retrieved entity
  | 
  |         return results;
  |     }
  |    // transaction ends
  | }
  | 

You should be able to stretch things out if your willing to do your own transaction management - however I'm very fuzzy on this issue so i'm probably not the best person to ask.

If your using a Stateful Session Bean, you can go with an Extended Persistence Context (@PersistenceContext(type = PersistenceContextType.EXTENDED)), which provides an session scoped EntityManager allowing you to maintain attached entities across a session - but again, this depends on the transaction in play, and the entity will become detached when the transaction ends.

Another consideration is Serialization. If your in a clustered environment, you'll find that the serialization/de-serialization of entities across servers (called passivation & activation) can also detatch your entities. So even if you have a Stateful Session Bean and an extended persistence context - you can still get the LazyInitializationExeption between requests.

Some newer frameworks can help you out here as well. Seam provides a "Conversation Scoped EntityManager" which can span multiple request/response cyles (so you rarely have a detached entity). Seam also handles clustering and the serialization/serialization of entities in your session and conversation scopes - so you don't have to worry about serialization detaching your entities either.

Spring provides an OpenEntityManagerInView filter which provides similar functionality - although I don't believe it works between requests. I believe Struts2 has a plug-in to provide similar functionality.


I hope all this helps, and that i didn't screw things up too badly (someone please correct me if i did :P).


View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4229820#4229820

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4229820



More information about the jboss-user mailing list