1

我正在尝试在控制台中打印我需要的超类字段的名称,以便稍后计算在一个简单的 POJO 时工作正常,但是当该类先前由 Hibernate 加载时,我得到的是子类的字段而不是超类和当我打印父级的名称时(当由 Hibernate 加载时,我得到以下信息)

[处理程序,_filter_signature,serialVersionUID,方法]

这是我的代码

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 类字段 [Parent Class]?

4

2 回答 2

1

基本上我怀疑 Hibernate 正在动态创建您的“子类”的另一个子类 - 并在您从会话中获取它时创建它的一个实例。您的代码当前依赖的实例是just的直接实例。 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 回答