Java反射superClass由hibernate加载问题

时间:2013-03-20 22:11:36

标签: java hibernate reflection

我正在尝试在控制台中打印我以后计算所需的superClass字段的名称工作正常,当一个简单的POJO但是当该类以前由Hibernate加载时,我得到的孩子的字段不是superClass,当我打印父级的名称时(由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 ]以后,来自孩子的字段就像hibernate现在是我的学生类的父,而不是我的代码中的抽象类。后

clazz.showFieldsFromSuperClass(newStudent);

正在打印学生字段的正确字段,在这种情况下是父母的人

我的问题是,无论什么时候来自hibernate或Spring容器的新实例,我怎么能得到Person类字段[Parent Class]?

2 个答案:

答案 0 :(得分:1)

基本上我怀疑Hibernate正在创建你的“子类”的另一个子类 - 当你从会话中获取它时创建一个实例。您的代码目前依赖的实例是 Student直接实例。

这很容易验证:

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

我怀疑它打印的内容是而不是你期待看到的内容。

鉴于您知道您想要的父类(可能是Student的超类),为什么不直接使用类文字引用它?

答案 1 :(得分:1)

Hibernate load()方法不会完全初始化检索到的对象,但会在您访问对象属性之前返回代理。

你可以使用一个特殊的hibernate助手类来获取对象的正确Class而不进行初始化:

HibernateProxyHelper.getClassWithoutInitializingProxy(student);