在使用hibernate的聯合主鍵時有以下幾個需要注意的問題:
1、首先就是映射文件中聯合主鍵的寫法,
例子:
2、聯合主鍵當中的字段不應該存在空值
在實際的開發當中我發現,如果聯合主鍵中的某一字段為空值,那麼將會導致通過該聯合主鍵查詢出來的結果為空值,這個問題不知道是hibernate的
bug還是spring集成hibernate時產生的問題,總之在實際使用的時候最好保證作為聯合主鍵的字段都是有值的。
3、主鍵容易沖突
hibernate聯合主鍵的另一個弊端就是存在主鍵重復的隱患,如果將某幾個字段做為聯合主鍵,在這些字段更新之後很可能造成重復,但數據庫中並不會報錯(存在其他不相同的字段),然而hibernate卻會報主鍵重復的錯誤。
4、使用起來麻煩
有時候只是需要查詢一個字段,但是卻要通過包含N個字段的聯合主鍵來進行查詢,這樣做未免勞民傷財十分的不爽。
所以在這裡奉勸大家還是少用聯合主鍵為好,避免不必要的麻煩,除非在萬萬不得已的情況下找不到不用聯合主鍵的方法。
本文轉自:http://blog.csdn.net/ystyaoshengting/article/details/7715782
我試驗了一下,用主鍵的某一個字段查詢,完全沒有問題,給你個例子,你根據實際情況修改下
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Query q = session.createQuery("from Teacher t where t.pk.name='KKK'");
Teacher t = (Teacher) q.uniqueResult();
System.out.println(t.getPk().getId() + ":" + t.getPk().getName());
session.getTransaction().commit();
聯合主鍵2種映射方式,
class Domain implements Serilziable{
private String name;
private String email;
}
映射文件:
<class ...>
<composite-id>
<key-property name="name" />
<key-property name="email" />
</composite-id>
</class>
get和刪除,都是直接用這個對象本身作為id:
Domain id=new Domain();
id.setName("");
id.setEmail("");
Domain domain=(Domain)session.get(Domain.class,id);
Domain id=new Domain();
id.setName("");
id.setEmail("");
session.delete(id);
第二種component composite id的方式,可以看看我個人說明裡面關於hibernate的資料,有復合主鍵的詳細介紹。希望對你有用。