I was rather surprised to see this exception:

  | Caused by: org.hibernate.HibernateException: cannot simultaneously fetch 
multiple bags
  |     at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:66)
  |     at org.hibernate.loader.hql.QueryLoader.<init>(QueryLoader.java:100)
  |     at 
org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
  |     at 
org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:110)
  |     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
  |     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
  |     at 
org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
  |     at 
org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
  |     at 
org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
  |     at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1612)
  |     at 
org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:76)
  |     ... 70 more
  | 

I have an entity called Order which has two lazy collections:


  | @Entity
  | @Table(name="tbl_order")
  | public class Order implements Serializable
  | {
  |     private List<Address> addresses;
  |     private List<OrderLine> orderItems;
  |     private List<TrackingNumber> trackingNumbers;
  | 
  |     public Order()
  |     {
  |     }
  |     
  |     @OneToMany(mappedBy="order", fetch=FetchType.LAZY, 
cascade=CascadeType.ALL)
  |     public List<Address> getAddresses()
  |     {
  |             return this.addresses;
  |     }
  |     
  |     public void setAddresses(List<Address> addresses)
  |     {
  |             this.addresses = addresses;
  |     }
  | 
  |     @OneToMany(mappedBy="order", fetch=FetchType.LAZY, 
cascade=CascadeType.ALL)
  |     public List<OrderLine> getOrderItems()
  |     {
  |             return this.orderItems;
  |     }
  | 
  |     public void setOrderItems(List<OrderLine> orderItems)
  |     {
  |             this.orderItems = orderItems;
  |     }
  | 
  |     @OneToMany(mappedBy="order", fetch=FetchType.LAZY, 
cascade=CascadeType.ALL)
  |     public List<TrackingNumber> getTrackingNumbers()
  |     {
  |             return this.trackingNumbers;
  |     }
  | 
  |     public void setTrackingNumbers(List<TrackingNumber> trackingNumbers)
  |     {
  |             this.trackingNumbers = trackingNumbers;
  |     }
  | }
  | 

The EJB-QL that caused the problem is:


  | ..........
  |                     String query = "select o from Order o " +
  |                                     "left join fetch o.addresses a " +
  |                                     "left join fetch o.orderItems ol " +
  |                                     "where o.id = :orderId";
  |                     
  |                     Query q = this.em.createQuery(query);   
  |                     q.setParameter("orderId", orderId);
  | ..........
  | 

Why can't I "left join fetch" preload more than one of these collections at the 
same time?  I was originally eagerly-loading the addresses but I decided that 
this was bad due to how my application uses this data...it would deteriorate 
performance at a level I'm not happy with.

Is this a bug or a limitation?

Thanks!

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

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


_______________________________________________
JBoss-user mailing list
JBoss-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to