2013-03-20 45 views
1

我想在控制檯打印超我需要在以後計算的字段的名稱是工作OK是一個簡單的POJO,但上課的時候是先前由Hibernate加載我是當讓孩子不超類的領域,當我打印父項的名稱(當由Hibernate加載我得到以下)Java反射超通過休眠問題加載

[處理程序,_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); 

被稱爲是印刷[處理程序,_filter_signature,serialVersionUID的,方法]後來從孩子的領域就像休眠現在是我的學生類的父不是我的抽象在代碼中的類。後來

clazz.showFieldsFromSuperClass(newStudent); 

正在打印權領域學生的領域以及它的父的人在這種情況下

我的問題是如何能得到Person類領域[父類]無論何時,只要來自於新實例休眠或通過Spring容器?

回答

1

Hibernate的load()方法並不完全初始化檢索的對象,但要等到訪問對象屬性返回的代理。

你可以得到對象的正確Class而無需使用特殊休眠輔助類初始化它:

HibernateProxyHelper.getClassWithoutInitializingProxy(student);

+0

感謝您在這個問題上幫助過我的所有人,我發現它非常有用......所有的解決方案......上帝保佑。 – javiut 2013-03-20 22:47:21

1

基本上我懷疑Hibernate是爲了動態創建的「子類」的另一個子 - 當你從會話獲取它創造者的一個實例。您的代碼目前依靠實例是的只是Student一個直接實例。

這是很容易驗證:

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

我懷疑它所打印的是你期待看到什麼。

鑑於你知道你想要的父類(大概Student的超類,爲什麼不只是指明確使用類文字?

+0

我得到時休眠加載的類以下。 [父 - >兒童] 由Hibernate加載:學生學生_ $$ _ javassist_21 例如,通過新:人青少年。 – javiut 2013-03-20 22:20:21

+0

@javiut:對,這樣就與我懷疑的東西有關係。所以如果你知道你想要使用的類,只需使用類文字即可。 – 2013-03-20 22:21:22