FetchType.LAZY没有从db获取对象

时间:2012-11-14 13:51:26

标签: java hibernate jpa

使用JPA(EntityManager)和Hibernate。

我有一个有3个集合的类,一个有FetchType.EAGER,另外两个有LAZY。如果我将其中的3个放入EAGER,我会得到一个例外,因为它只能有一个。这样,当我尝试使用其中一个LAZY列表时,我得到一个例外:

no session or session was closed: javax.faces.el.EvaluationException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:

那么,当我要求时,我怎样才能获得2个系列?

我的课程:

public class Event implements....
....
....    
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name="friendsList")
private List<Long> friends;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name="carsList")
private List<Long> cars;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="housesList")
private List<Long> houses;

我试过这个但仍然无法正常工作

@Override
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public IEvent synchronizeCarsList(IEvent companyToSynchronize){
    if(companyToSynchronize == null)
        throw new IllegalArgumentException();
    if(entityManager != null) {
        List<Long> cars = companyToSynchronize.getSelectedCarsIdList();

    }
    return companyToSynchronize;
}

编辑: 当我在一个实体中有多个EAGER时(或我从日志中理解的)

时部署的例外情况
Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
at org.hibernate.loader.BasicLoader.postInstantiate(BasicLoader.java:94) [:3.6.6.Final]
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:119) [:3.6.6.Final]
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:71) [:3.6.6.Final]
at org.hibernate.loader.entity.EntityLoader.<init>(EntityLoader.java:54) [:3.6.6.Final]
at org.hibernate.loader.entity.BatchingEntityLoader.createBatchingEntityLoader(BatchingEntityLoader.java:133) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1914) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.createEntityLoader(AbstractEntityPersister.java:1937) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.createLoaders(AbstractEntityPersister.java:3205) [:3.6.6.Final]
at org.hibernate.persister.entity.AbstractEntityPersister.postInstantiate(AbstractEntityPersister.java:3191) [:3.6.6.Final]
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348) [:3.6.6.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872) [:3.6.6.Final]
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906) [:3.6.6.Final]
... 105 more

问候。

2 个答案:

答案 0 :(得分:3)

简单地指定延迟加载的Collection的值不足以触发加载。您将获得的只是对代理的引用。这就是为什么交易外的访问会失败的原因。

.size()上调用Collection,同时仍然在事务中,将触发加载,以及需要访问实际内容的任何其他方法。

答案 1 :(得分:2)

我做的是:

@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name="friendsList")
@OrderColumn(insertable=true,updatable=true,name="friendsOrder")
private List<Long> friends;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name="carsList")
@OrderColumn(insertable=true,updatable=true,name="carsOrder")
private List<Long> cars;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name="housesList")
private List<Long> houses;

通过这种方式,我可以立即获得所有收藏品。我必须阅读有关@OrderColumn的更多信息,但在这种情况下,它对我有用。 感谢@Perception。