0

宣言されたフィールドをループし、オブジェクトの 2 つのインスタンスの違いを見つけて出力する関数を実行しています (監査証跡用)。ただし、休止状態セッションからロードするオブジェクトを使用すると、IE:

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

そのオブジェクトの宣言されたフィールドは、default_interceptor、handler、_filter、methods で出てきます。ここで、session.load を使用せずに同じタイプのオブジェクトをロードすると、実際に宣言されたフィールドが正常に検出されます。この hs オブジェクトに対して getClass().toString() を実行すると、以下が返されます。

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

javaasssist_1 が問題であると言える限り、何らかの理由で実際のクラスが見つかりません。

私に何ができるか考えていますか?

4

1 に答える 1

3

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

プロキシはサブクラス化によって動的に作成されます。プロキシはHazardSubmission.classそうではなくHazardSubmission.class、そのためgetDeclaredFields()、返されたインスタンスでは実際Fieldのプロキシではありません。HazardSubmission.class

生成されたプロキシインスタンスから実際を取得するには、Hibernate.getClass()Classを使用できます

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());
}
于 2012-04-16T06:35:12.780 に答える