0

プロジェクトのライブラリを更新しようとしています (Hibernate 3.2.1 GA から Hibernate 4.2.8 へ)

この (複雑な) アプリケーションは、LAZY ローディングを使用し、後で必要なときにのみオブジェクトを取得します。--> org.hibernate.LazyInitializationException : could not initialize proxy - no Session が発生したため、動作が異なるようです

@Entity
@Table(name = "CLIENTS")
public class Clients  {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INFOIDT", insertable = true, updatable = false)
private Information info;
//...
}

製品を使用する前に製品について詳しく知る必要がある場合:

cli.getInfo();

私の persistence.xml では、プロパティ hibernate.cache.provider_class が org.hibernate.cache.EhCacheProvider に設定されており、2 番目のレベルのキャッシュになっていることに注意してください。

質問 :既存のコードを Hibernate4 に移行する簡単な方法は何ですか? (上記の例のクラスは、LAZY ローディングを使用した多くのケースを説明するための偽の例です) ありがとうございます。

要求に応じて、以下の私の DAO を参照してください。

public class MyAppJpaDAO extends GenericJpaDAO implements IMyAppDAO {
    protected static Log log = LogFactory.getLog(MyAppJpaDAO.class);

    // Entity Manager of the project
    @PersistenceContext(unitName = "MyApp.hibernate")
    private EntityManager em;

    public News readLastNews() {
        StringBuffer sql = new StringBuffer("");
        sql.append(" select object(n) ");
        sql.append(" from News n ");
        sql.append(" Where n.flagLastStatus = 'V' ");
        sql.append(" order by n.pk.date desc ");
        Query aQuery = em.createQuery(sql.toString());

        List<News> res = (List<News>) aQuery.getResultList();
        if (res != null && res.size() != 0) {
            return res.get(0);
        }
        return null;
    }

    //...

    }

/////////////

public class GenericJpaDAO implements IGenericDAO {

    protected static Log log = LogFactory.getLog(GenericJpaDAO.class);

    @PersistenceContext(unitName = "MyApp.hibernate")
    EntityManager em;

    public Object getReference(Class _class, Object _object) {
        return em.getReference(_class, _object);
    }

    public void createObject(Object object) {
        try {
            em.persist(object);
        } catch (LazyInitializationException lie) {
            em.merge(em.merge(object));
        }
    }

    public void deleteObject(Object object) {
        try {
            em.remove(object);
        } catch (Exception e) {
            em.remove(em.merge(object));
        }
    }

    public void updateObject(Object object) {
        em.merge(em.merge(object));
    }

    //...

    }
4

3 に答える 3

0

LazyLoading を使用する場合は、.getInfo() を呼び出すときにセッションを開いて接続する必要があります。org.hibernate.LazyInitializationException は、エンティティを取得しようとしたときにセッションが切断または閉じられた場合に発生します。セッション処理に問題があると思います。エンティティとは何の関係もありません。

于 2014-02-06T14:55:07.760 に答える