2017-03-27 10 views
0

私はHibernate 5 & Springデータを使用しています。私はこのようにそれを呼び出しています単純なHibernate/JPAクエリを返すプロキシオブジェクト

@Query("from Party where id in :partyIDs") 
List<PartyTO> loadByIDs(@Param("partyIDs") List<Long> partyIDs); 

partyList = partyDao.loadByIDs(userPartyIDsList)); 

が、私はnullに設定し、すべてのフィールドで(Hibernateのプロキシオブジェクトのリストを取得しています私のPartyDaoインサイド は、私は次のメソッドを持っていますorg.hibernate.proxy.pojo.javassist.JavassistLazyInitializerhandlerフィールド)。

これは意味をなさない!なぜ、Hibernateはオブジェクトをロードしないのですか?クエリルートから私は指定していますか?

私はそれを変更する:私はこのオブジェクトにフェッチしたいということ、それがより明確にしようとする

@Query("select party from Party party where party.id in :partyIDs") 
List<PartyTO> loadByIDs(@Param("partyIDs") List<Long> partyIDs); 

、それはまだプロキシオブジェクトを返します。私は行方不明のものがありますか?私はそれが自分自身をフェッチする方法を知らない。

EDIT: プロキシオブジェクトは、実際に設定されているすべての属性を持っているtargetと呼ばれる属性を持っています。なぜ彼らはオブジェクト自体に配置されていませんか?

私は「遅延初期化の例外」を得ていないのです

はなく、名前でパーティーをソートされComparator内部NullPointerException

値がプロパティメソッドを呼び出すことで、主被写体に読み込まれます
... 
return o1.name.compareTo(o2.name); 
+1

あなたはPartyを選択しますが、PartyTOのリストを期待していますか? –

+0

データベーステーブルとクラスの名前は、マッピングファイルで次のように設定されています。 –

+1

あなたは 'PartyTO p from p.id in:partyIDs'で試しましたか?マッピングファイルを表示できますか? – dcalap

答えて

2

... 
    return o1.name.compareTo(o2.name); 

Hibernateは常にプロキシオブジェクトを返しますし、いくつかのより複雑な構造の直列化が挙げ怠惰なインスタンス化の例外を含む、将来的に問題にあなたを導く可能性があります。しかし、問題の原因はプロパティの直接アクセスです。コンパレータ内のゲッター関数を正しく使用すると、他の問題は発生しません。

プロキシオブジェクトはターゲットクラスのランタイム拡張です。ターゲットクラスと同じインターフェイスを持ちますが、実際のOODの方法では、内部は表示されず、アクセスできません。唯一の保証は提示されたインタフェースコントラクトであり、それはあなたのオブジェクト内に関係なくコーディングすべきものです。

コンパレータと他のコードを次のように変更してください。この問題は再び発生しません。

... 
    return o1.getName().compareTo(o2.getName()); 
1

属性自体の代わりに。

Comparator return文に変更する必要があります。問題は、あなたのオブジェクトのnameプロパティへの直接のアクセスである

return o1.getName().compareTo(o2.getName()); 
関連する問題