1

hibernateを使用して簡単なhello-wordishコードを作成しました

sf = new Configuration().configure().buildSessionFactory();
System.out.println("sessionFactory is built.Get session object");
s = sf.openSession();
Kk emp = (Kk) s.get(Kk.class, 1);
if (null != emp) {
    System.out.println(emp.getId() + " " + emp.getNm());
} else {
   System.out.println("Emp doesn't exist..");
}

このコードは正常に機能し、コンソールで以下に示すように、1つのレコードを取得します:-

sessionFactory is built.Get session object
Hibernate: select kk0_.id as id0_0_, kk0_.name as name0_0_ from kaushik1 kk0_ where kk0_.id=?
1 kaushik

しかし、Hibernate構成を介してLoadイベントリスナークラスを導入すると、レコードがフェッチされません。むしろ、クエリ自体は実行されません。

私のリスナークラスは:-

import org.hibernate.HibernateException;
import org.hibernate.event.LoadEvent;
import org.hibernate.event.LoadEventListener;

public class MyLoadListener implements LoadEventListener {

    public void onLoad(LoadEvent arg0, LoadType arg1) throws HibernateException {
        System.out.println("inside my own onLoad listener");
    }

}

そして、hibernate.cfg.xmlに次の行を追加しました:-

<listener type="load" class="com.cts.eventlistener.MyLoadListener"/>

同じコードが呼び出されると、コンソールで確認できます:-

sessionFactory is built.Get session object
inside my own onLoad listener
Emp doesn't exist..

イベントリスナーのonLoadが呼び出されたときにクエリが呼び出されないのはなぜですか?

4

2 に答える 2

0

DefaultLoadEventListenerを構成する必要性は、ビットカウンターの直感的です。

この場合、そのリスナーにとってより良い方法を見つけました。LoadEventListenerインターフェースを実装する代わりに、DefaultLoadEventListenerを「拡張」する必要があります。そのonLoad()をオーバーライドし、その中でsuper.onLoad()を呼び出します。これは非常にうまくいきました。

import org.hibernate.event.LoadEvent;
import org.hibernate.event.LoadEventListener;
import org.hibernate.event.PreLoadEventListener;
import org.hibernate.event.def.DefaultLoadEventListener;

import com.cts.closr.Kk;

public class MyLoadListener extends DefaultLoadEventListener  {

    public void onLoad(LoadEvent arg0, LoadType arg1) throws HibernateException {
        System.out.println("inside my own onLoad listener");
        super.onLoad(arg0, arg1);
    }

}

また、構成では、カスタムリスナーのみを構成します。

<event type="load">
       <listener class="com.cts.eventlistener.MyLoadListener"/>
</event>
于 2012-06-28T04:58:46.900 に答える
0

カスタムリスナーは、実際にオブジェクトをロードするデフォルトのリスナーをオーバーライドします。両方を宣言する必要があります。14.2を参照してください。イベントシステム

于 2012-06-27T08:56:26.037 に答える