關於hibernate的load()方法的相關實驗

定義一個Person類:
基本配置
主鍵:id
屬性:name、age
Person.hbm.xml中主鍵配置:<id name="id" />
使用時
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,2);
ts.commit(); 
System.out.println(t.getId());
System.out.println(t);
session.close();
結果:一切正常顯示:id:2,並顯示代理對象

改一
使用時:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,2);
ts.commit(); 
System.out.println(t);
session.close();
System.out.println(t.getId());
結果:一切顯示和上面的基本配置一樣,這裏t.getId()並不從數據庫中查詢(因爲沒有看到查詢語句顯示),本人嘗試着將id單獨提取並更換爲一個擁有兩個屬性的主鍵對象後,並在load方法之前爲之賦值,則t也可以得到這兩個屬性。

改二:
使用時:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,2);
ts.commit(); 
session.close();
System.out.println(t.getId());
System.out.println(t);
結果:出現錯誤了,但是id可以正常顯示
原因:在session中找不到對應的t
觀察一二改法本人總結:load(class,args)方法,通過對load方法的參數解析 生成對應class類的子類(並返回這個子類對象作爲代理對象,並存儲到session中),並通過第二個參數args爲代理對象附上主鍵屬性,然後在你需要使用這個代理對象的時候(除開主鍵屬性查詢),他會通過它的主鍵屬性在數據庫中查詢,並存放session中,然後在session中通過主鍵屬性查找相應的對象屬性及方法。
改三:
使用時:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,p);
ts.commit();
System.out.println(t.getId());
System.out.println(t);
session.close();
結果:直接報錯

改四:
Person.hbm.xml中主鍵配置:
<composite-id>
 <key-property name="id"></key-property>
</composite-id>
使用時:
Person p = new Person();
p.setId(2);
Transaction ts = session.beginTransaction();
Person t = (Person)session.load(Person.class,p);
ts.commit(); 
System.out.println(t.getId());
System.out.println(t);
session.close();
結果:又可以正常顯示了

以上實現都是在基本配置上修改,使用hibernate4.1.2和mysql5.0及mysql5.1.2驅動包實現上

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章