2016-11-03 9 views
0

私はJava 8とSpring Data JPAをHibernateで使用しています。私は奇妙な行動を観察している。JPA - 遅延ロードされたエンティティ参照にフィールドがありますnull

すべてのエンティティリレーションシップはLAZYです。

Course toBeMatched = //...a repository call to get a course...; 

for (Student s : college.getStudents()) { 
    if (s.getCourse().equals(toBeMatched)) { 
    found = true; 
    } 
} 

equals()方法は、本物のケースのためにもfalseを返します。 Course#equalsの実装は多少これらの線に沿っている:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 

    Course other = (Course) obj; 
    if (shortName == null) { 
     if (other.shortName != null) 
      return false; 
    } else if (!shortName.equals(other.shortName)) 
     return false; 
    return true; 
} 

問題:私はother.getShortName()を使用する場合other.shortNameは常にnullあるようが 私の問題は、誤ってshortName.equals(other.shortName)失敗したということですが、しかし、私は正しく値を取得します。

私の質問は、ゲッターメソッドを実行する代わりに、遅延ロードされたエンティティのフィールドにアクセスすることによって、何か根本的に間違っているかどうかです。

+0

これは、バイトコード拡張の代わりにプロキシを使用することで、Hibernateを使用するときに得られるものです。そのため、使用状況を検出できないため、レイジーローディングフィールドについてはわかりません。バイトコードの拡張機能をオンにするか、そのままの形でJPAプロバイダを使用する –

答えて

3

Hibernate ORMキャッシングをサポートし、パフォーマンスを向上させるために、プロキシオブジェクトと遅延ロードを返します。現在、プロキシフィールドへの呼び出しを傍受する方法はないため、other.shortNameは常にnullになります。プロキシメソッドへの呼び出しを傍受する方法があります。あなたの場合のように、other.getShortName()がそれを行う方法です。

関連する問題