2012-04-16 8 views
0

私は、宣言されたフィールドをループし、オブジェクトの2つのインスタンス間の差異を見つけて出力します(監査証跡用)。私はHibernateセッションからオブジェクトの読み込み、IEを使用する場合は、:default_interceptor、ハンドラ、_filter、私はせずに、同じ型のオブジェクトをロードする場合の方法:JavaリフレクションのgetDeclaredFieldsでHibernate session.load()が機能しませんか?

HazardSubmission hs = (HazardSubmission)s.load(HazardSubmission.class, id); 

そのオブジェクトの宣言されたフィールドがで出てきますsession.loadを使用すると、ACTUAL宣言されたフィールドが正常に見つかります。 。私は、このHSオブジェクト上で()のgetClass()のtoStringを実行した場合、それが返されます。

class nz.co.g.hs.stripes.model.HazardSubmission_$$_javassist_1 

は、私の知る限りjavaasssist_1を伝えることができるような問題である場合は、何らかの理由でそれが実際のクラスを見つけていません。

私は何ができるでしょうか?

+0

使用することができます。http://stackoverflow.com/questions/2216547/converting-hibernate-proxy-to-real-object – Baconbeastnz

答えて

3

session.load(HazardSubmission.class, 1)は、ID番号1のHazardSubmission.classのインスタンスが現在のセッションで見つかるかどうかを最初にチェックします。 yesの場合、そのインスタンスが返されます。それ以外の場合は、プロキシが返されます。

プロキシをサブクラス化HazardSubmission.class。彼らによって動的に作成されているがHazardSubmission.classではなく、返されたインスタンス上のgetDeclaredFields()が生成されたプロキシインスタンスから実際のClassを取得するにはHazardSubmission.class

の実際のFieldではありませんだからこそ、あなたはソリューションはここにあるHibernate.getClass()

HazardSubmission hs = (HazardSubmission)s.load(HazardSubmission.class, id); 

System.out.println(Hibernate.getClass(hs).toString()); 
for (Field field : Hibernate.getClass(hs).getDeclaredFields()) { 
    System.out.println(field .toString()); 
} 
関連する問題