定義一個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驅動包實現上