1

後のコンピューティングに必要なスーパークラスのフィールドの名前をコンソールに出力しようとしていますが、が単純なPOJOの場合は正常に機能していますが、クラスが以前にHibernateによってロードされた場合、スーパークラスではなく子のフィールドを取得しています。親の名前を出力すると(Hibernateによってロードされると、次のようになります)

[handler、_filter_signature、serialVersionUID、methods ]

これが私のコードです

public static void main(String[] args)
{
    FixingModels clazz = new FixingModels();
    HibernateHandler handler = new HibernateHandler(true);
    Student student =  (Student)handler.getSession().load(Student.class,1);
    Student newStudent = new Student();
    System.out.println("Printing Class loaded by Hibernate");
    clazz.showFieldsFromSuperClass(student);//show the Fields of the Child and parent wrong
    System.out.println("--------------------------------------------------");
    System.out.println("Printing Class instance by new..");
    clazz.showFieldsFromSuperClass(newStudent);//Show the fields from the parent and child IS O.K
}
private void showFieldsFromSuperClass(Student clazz) 
{
    final Class objectClass = clazz.getClass();
    final Class parentClass = objectClass.getSuperclass();
    System.out.println("Printing Child");
    for(Field field:objectClass.getDeclaredFields())System.out.println(field.getName());//printing child
    System.out.println("Printing Parent");
    for(Field field:parentClass.getDeclaredFields())System.out.println(field.getName());//printing parent
}

初めて

clazz.showFieldsFromSuperClass(student);

呼び出されるのは、[handler、_filter_signature、serialVersionUID、methods ]を出力することです。後で、子のフィールドは、休止状態がコードの抽象クラスではなく、学生クラスの親になっているようになります。後で

clazz.showFieldsFromSuperClass(newStudent);

正しいフィールドを学生フィールドと同様に印刷していますこの場合は親Personです

私の質問は、休止状態またはSpringコンテナの新しいインスタンスから取得するたびにPersonクラスフィールド[親クラス]を取得するにはどうすればよいですか?

4

2 に答える 2

1

基本的に、Hibernateはその場で「子クラス」の別のサブクラスを作成していると思います-そして、セッションからそれをフェッチするときにそのインスタンスを作成します。あなたのコードは現在、インスタンスがちょうどの直接インスタンスであることに依存しています。 Student

これは簡単に確認できます。

System.out.println("Instance class: " + objectClass);

私はそれが印刷するものがあなたが見ることを期待しているものではないのではないかと思います。

必要な親クラス(おそらくのスーパークラス)がわかっている場合Student、クラスリテラルを使用して明示的に参照しないのはなぜですか?

于 2013-03-20T22:14:38.407 に答える
1

Hibernate load()メソッドは、取得したオブジェクトを完全には初期化しませんが、オブジェクトプロパティにアクセスするまでプロキシを返します。

Class特別な休止状態のヘルパークラスを使用して、オブジェクトを初期化せずに正しいオブジェクトを取得できます。

HibernateProxyHelper.getClassWithoutInitializingProxy(student);

于 2013-03-20T22:34:54.727 に答える