2011-08-03 5 views
6

ロードとゲットの違いを理解できません。次のコードはsession.loadを与えるとうまくいきません。それはヌルポインタ例外を与えます。しかし、私はsession.get()を使っているときも同じことができます。セッションを理解しています。ハイバネートのsession.loadメソッド

public Employee getEmployee(final String id){   
     HibernateCallback callback = new HibernateCallback() { 
      public Object doInHibernate(Session session) 
       throws HibernateException,SQLException { 
       //return (Employee)session.load(Employee.class, id); doesn't work 
        return (Employee)session.get(Employee.class, id); //it works 
      } 
     };   
     return (Employee)hibernateTemplate.execute(callback); 
    } 

私はまた、SessionオブジェクトがdoInHibernateに渡されるかを理解したいと思いますか。?
セッションはいつ開始され、終了するのですか?

Exception in thread "main" java.lang.NullPointerException 
    at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372) 
    at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121) 
    at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232) 
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173) 
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87) 
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862) 
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:781) 
    at org.hibernate.impl.SessionImpl.load(SessionImpl.java:774) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1282) 
    at $Proxy0.load(Unknown Source) 
    at hibernate.EmployeeDao$1.doInHibernate(EmployeeDao.java:25) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339) 
    at hibernate.EmployeeDao.getEmployee(EmployeeDao.java:29) 
    at hibernate.SpringHibernateTest.main(SpringHibernateTest.java:26) 
+0

「動作しない」とはどういう意味ですか? NullPointerExceptionを引き起こす行は何ですか? –

+1

Google for "for org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)"。あなたはHibernateの古いバージョンを実行していますが、この例外のいくつかの理由(不正なマッピング、不良なJARなど)が見つかりました。それはload vs getとはあまり関係がありません。 –

+0

@JB Nizet:ありがとうございました!!!私は自分のビルド構成をチェックし、私はこの問題に直面している古いジャーを更新し、プロジェクトをメイベールすることを学んでいます...しかし、他の疑問を持って私を助けてください。セッションオブジェクトがdoInHibernateに渡される方法 セッションはいつ開始され、終了するのですか?** –

答えて

8
I am not able to understand the difference between load and get 

を次のようにスタックトレースがある主な違いは次のとおりです。負荷()は、例外がスローされ、キャッシュまたはデータベース内のオブジェクトを見つけることができない場合。 load()メソッドは決してnullを返しません。オブジェクトが見つからない場合、get()メソッドは を返します。 他の違いは、load()メソッドは実際のインスタンスの代わりにプロキシを返すかもしれないが、get()はプロキシを返さないことです。オブジェクトが見つからない場合

the following piece of code doesn't work when i give session.load. It gives null pointer exception. But same does work when i am using session.get() . 

、loadメソッドが例外をスローしますがwon't.Simpleを取得します

編集: は物事を詳しく説明するために、

  1. ときのget()メソッドが呼び出されると、データベースに直接ヒットし、結果をフェッチして返します。一致するフィールドが見つからない場合は、喜んでnullを返します。

  2. しかし、load()が実行されると、最初に必要なオブジェクトのキャッシュが検索されます。見つかった場合、すべてが順調です。しかし、オブジェクトがキャッシュ内に見つからない場合、load()メソッドはプロキシを返します。このプロキシは、データベースクエリの実行のためのショートカットと考えることができます。データベースのヒットはまだ行われていないことを忘れないでください。実際にオブジェクトにアクセスすると、プロキシがトレースされ、データベースがヒットします。

簡単な例を考えてみましょう。

User user=(User)session.load(User.class, new Long(1));//Line 1 
System.out.println(user.getPassword());//Line 2 

主キー1を持つユーザーオブジェクトがload()メソッドは、今すぐ「ユーザオブジェクトの実際の値が呼び出されたとき、すなわちをライン1でのデータベースのプロキシを設定します、セッションでは使用できない場合2行目では、プロキシがトレースされ、データベースがヒットします。

希望すると、これが役立ちます。

+1

いいえ:loadはデータベース内のオブジェクトをルックアップしません。オブジェクトがデータベースに存在することを前提として、セッションキャッシュにあるオブジェクトを返します。プロキシを作成します。 –

+0

@Pravin:私はすでにマニュアルからこれを読んでいます。私はあなたにちょうど言ったことの意味を私に説明してほしかった。ロードメソッドが実際のインスタンスではなくプロキシを返すと言われたら、それはいくつかのキャッシュからデータを返し、したがって、loadメソッドはデータベースへの複数のデータヒットを必要としません。また、null値が参照されているときにnullポインタ例外が発生することを理解しています。すべて役に立たない –

+0

@Anupam、私は物事をより明確にするために投稿を編集しました。私が失った代表者をこれが回復することを願っています。 –

関連する問題