1

JPA (EntityManager) と Hibernate の使用。

私は 3 つのコレクションを持つクラスを持っています.1 つは FetchType.EAGER を持ち、他の 2 つは LAZY を持っています。それらの 3 つを EAGER に入れると、1 つしか持てないため、例外が発生します。このようにして、LAZY リストの 1 つを使用しようとすると、例外が発生します。

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;
}

編集: 1 つのエンティティに複数の 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

よろしく。

4

2 に答える 2

3

遅延ロードの値を割り当てるだけではCollection、ロードをトリガーするのに十分ではありません。取得できるのは、プロキシへの参照だけです。そのため、トランザクション外へのアクセスは失敗します。

トランザクション中に を呼び出す.size()Collection、実際のコンテンツへのアクセスを必要とする他のメソッドと同様に、ロードがトリガーされます。

于 2012-11-14T13:58:01.663 に答える
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へのThx。

于 2012-11-14T16:08:15.600 に答える