0

Web アプリケーションで Spring + Hibernate を使用したいと考えています。私のアプリケーションはSpringなしで書かれています。「ページを開く」アクションが呼び出されたら、Hibernate セッションを開き、それを Http セッションに保存して、DAO 間で共有します。保存アクションが呼び出されると、古いセッションを使用してトランザクションを開始します。

しかし今、古い DAO を HibernateDaoSupport ベースの DAO に移行したいと考えています。この場合、どうすればセッションを共有できますか? DAO が beans.xml 内の 1 つの SessionFactory を参照する場合、それらは同じセッションを共有しますか? この場合、セッションを管理するにはどうすればよいですか (新規で開くか、古いものを使用します)?

私は次のコードを書いていますが、私は得る

org.hibernate.LazyInitializationException: プロキシを初期化できませんでした - セッションがありません

ページ上 System.out.println(obj.getCategory().getName());

public class CategoryObjectDAOSpringImpl extends HibernateDaoSupport implements CategoryObjectDAO {

@Override
public CategoryObject get(int id) throws Exception {


    CategoryObject obj = getHibernateTemplate().get(CategoryObject.class, id);

    System.out.println(obj.getId());


    System.out.println(obj.getCategory().getName());

    for (ObjAttrCommon objAttr : obj.getAttributes()) {
        //objAttr.setSession(getSession());
        System.out.println(objAttr.getId());
    }

    return obj;
}

追加すると不思議です

getSessionFactory().openSession();

私は同じ例外を持っています。

4

1 に答える 1

0

この投稿にも同じ回答が有効だと思います:

作業単位」をリクエストごとに自動的に作成できない場合は、トランザクションを使用してサービスレイヤーで手動で作成できると思います。このようなもの:

public Object serviceMethod(params) {
   TransactionTemplate transactionTemplate = getHibernateTemplate().get(CategoryObject.class, id);
   transactionTemplate.execute(new TransactionCallbackWithoutResult() {
         public void doInTransactionWithoutResult(TransactionStatus status) {
         try {
        // call your DAO's to update/delete/... and set values to service
         } catch (DAOException e) {
        LOGGER.error(e);
        throw new ServiceException(e);
         }
    }
});
}

EDITED : 例外がトランザクション内に表示されるほど範囲外です。問題が自分の視野にないことを確認してください。HibernateTemplate を使用してエンティティを取得した後、ビューからアクセスすると、LazyException が説明されます。これは、ビューからオブジェクトにアクセスすると、Hibernate セッションが既に閉じられているためです。

JSP/JSF でモデルを使用している場合、すべての要求コンテキストをカバーするために作業単位を拡張する必要があります。Hibernate セッションの開始を管理するフィルターを含める必要があります。これは Open Session In view パターンと呼ばれます。これを見てください。この投稿に表示されているフィルターの実装をコピーして、アプリケーションに含めると、問題が解決するはずです。

于 2012-09-07T11:12:33.507 に答える