日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Hibernate復(fù)合主鍵映射

目 錄:

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的鎮(zhèn)遠(yuǎn)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

1. 實(shí)現(xiàn)方式一:將復(fù)合主鍵對(duì)應(yīng)的屬性與實(shí)體其他普通屬性放在一起

2. 實(shí)現(xiàn)方式二:將主鍵屬性提取到一個(gè)主鍵類中,實(shí)體類只需包含主鍵類的一個(gè)引用

在日常開發(fā)中會(huì)遇到這樣一種情況,數(shù)據(jù)庫中的某張表需要多個(gè)字段列才能唯一確定一行記錄,這時(shí)表需要使用復(fù)合主鍵。面對(duì)這樣的情況Hibernate為我們提供了兩種方式來解決復(fù)合主鍵問題。

方式一:將復(fù)合主鍵對(duì)應(yīng)的屬性與實(shí)體其他普通屬性放在一起

例如實(shí)體類People中"id"和"name"屬性對(duì)應(yīng)復(fù)合主鍵:

 
 
 
 
  1. /*實(shí)體類,使用復(fù)合主鍵必須實(shí)現(xiàn)Serializable接口*/ 
  2. public class People implements Serializable  
  3. {  
  4.     private static final long serialVersionUID = -4888836126783955019L;  
  5.       
  6.     private String id;  
  7.     private String name;  
  8.     private int age;  
  9.       
  10.     public People()  
  11.     {  
  12.           
  13.     }  
  14.  
  15.     public String getId()  
  16.     {  
  17.         return id;  
  18.     }  
  19.  
  20.     public void setId(String id)  
  21.     {  
  22.         this.id = id;  
  23.     }  
  24.  
  25.     public String getName()  
  26.     {  
  27.         return name;  
  28.     }  
  29.  
  30.     public void setName(String name)  
  31.     {  
  32.         this.name = name;  
  33.     }  
  34.  
  35.     public int getAge()  
  36.     {  
  37.         return age;  
  38.     }  
  39.  
  40.     public void setAge(int age)  
  41.     {  
  42.         this.age = age;  
  43.     }  
  44.  
  45.     @Override 
  46.     public int hashCode()  
  47.     {  
  48.         final int prime = 31;  
  49.         int result = 1;  
  50.         result = prime * result + ((id == null) ? 0 : id.hashCode());  
  51.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  52.         return result;  
  53.     }  
  54.  
  55.     @Override 
  56.     public boolean equals(Object obj)  
  57.     {  
  58.         if (this == obj)  
  59.             return true;  
  60.         if (obj == null)  
  61.             return false;  
  62.         if (getClass() != obj.getClass())  
  63.             return false;  
  64.         People other = (People) obj;  
  65.         if (id == null)  
  66.         {  
  67.             if (other.id != null)  
  68.                 return false;  
  69.         }  
  70.         else if (!id.equals(other.id))  
  71.             return false;  
  72.         if (name == null)  
  73.         {  
  74.             if (other.name != null)  
  75.                 return false;  
  76.         }  
  77.         else if (!name.equals(other.name))  
  78.             return false;  
  79.         return true;  
  80.     }  

People.hbm.xml:

 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.      
  6.          
  7.          
  8.              
  9.              
  10.              
  11.          
  12.  
  13.          
  14.      
  15.  

Hibernate中使用復(fù)合主鍵時(shí)需要注意一些規(guī)則:

1. 使用復(fù)合主鍵的實(shí)體類必須實(shí)現(xiàn)Serializable接口。必須實(shí)現(xiàn)Serializable接口的原因很簡單,我們查找數(shù)據(jù)的時(shí)候是根據(jù)主鍵查找的。打開Hibernate的幫助文檔我們可以找到get與load方法的聲明形式如下:

Object load(Class theClass,Serializable id)

Object get(Class theClass,Serializable id)

當(dāng)我們查找復(fù)合主鍵類的對(duì)象時(shí),需要傳遞主鍵值給get()或load()方法的id參數(shù),而id參數(shù)只能接收一個(gè)實(shí)現(xiàn)了Serializable接口的對(duì)象。而復(fù)合主鍵類的主鍵不是一個(gè)屬性可以表示的,所以只能先new出復(fù)合主鍵類的實(shí)例(例如:new People()),然后使用主鍵屬性的set方法將主鍵值賦值給主鍵屬性,然后將整個(gè)對(duì)象傳遞給get()或load()方法的id參數(shù),實(shí)現(xiàn)主鍵值的傳遞,所以復(fù)合主鍵的實(shí)體類必須實(shí)現(xiàn)Serializable接口。

2. 使用復(fù)合主鍵的實(shí)體類必須重寫equals和hashCode方法。必須重寫equals和hashCode方法也很好理解。這兩個(gè)方法使用于判斷兩個(gè)對(duì)象 (兩條記錄)是否相等的。為什么要判斷兩個(gè)對(duì)象是否相等呢?因?yàn)閿?shù)據(jù)庫中的任意兩條記錄中的主鍵值是不能相同的,所以我們?cè)诔绦蛑兄灰_保了兩個(gè)對(duì)象的主鍵值不同就可以防止主鍵約束違例的錯(cuò)誤出現(xiàn)。也許這里你會(huì)奇怪為什么不使用復(fù)合主鍵的實(shí)體類不重寫這兩個(gè)方法也沒有主鍵違例的情況出現(xiàn),這是因?yàn)槭褂脝我恢麈I方式,主鍵值是Hibernate來維護(hù)的,它會(huì)確保主鍵不會(huì)重復(fù),而復(fù)合主鍵方式,主鍵值是編程人員自己維護(hù)的,所以必須重寫equals和hashCode方法用于判斷兩個(gè)對(duì)象的主鍵是否相同。

3. 重寫的equals和hashCode方法,只與主鍵屬性有關(guān),普通屬性不要影響這兩個(gè)方法進(jìn)行判斷。這個(gè)原因很簡單,主鍵才能決定一條記錄,其他屬性不能決定一條記錄。

保存測(cè)試:

 
 
 
 
  1. public class Client  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         Session session = HibernateUtil.getSessionFactory().openSession();  
  6.         Transaction tx = null;  
  7.           
  8.         try 
  9.         {  
  10.             tx = session.beginTransaction();  
  11.               
  12.             People people = new People();  
  13.             /*主鍵值由我們自己維護(hù)*/ 
  14.             people.setId("123456");  
  15.             people.setName("zhangsan");  
  16.             people.setAge(40);  
  17.               
  18.             session.save(people);  
  19.               
  20.             tx.commit();  
  21.         }  
  22.         catch (Exception e)  
  23.         {  
  24.             if(tx != null)  
  25.             {  
  26.                 tx.rollback();  
  27.             }  
  28.               
  29.             e.printStackTrace();  
  30.         }  
  31.         finally 
  32.         {  
  33.             session.close();  
  34.         }  
  35.     }  

看看數(shù)據(jù)庫:

數(shù)據(jù)被正確的插入到數(shù)據(jù)庫中了。

讀取數(shù)據(jù)測(cè)試:

 
 
 
 
  1. public class Client  
  2. {  
  3.     public static void main(String[] args)  
  4.     {  
  5.         Session session = HibernateUtil.getSessionFactory().openSession();  
  6.         Transaction tx = null;  
  7.           
  8.         try 
  9.         {  
  10.             tx = session.beginTransaction();  
  11.               
  12.             /*查詢復(fù)合主鍵對(duì)象,需要先構(gòu)建主鍵*/ 
  13.             People peoplePrimaryKey = new People();  
  14.             peoplePrimaryKey.setId("123456");  
  15.             peoplePrimaryKey.setName("zhangsan");  
  16.               
  17.             /*然后將構(gòu)建的主鍵值傳入get方法中獲取對(duì)應(yīng)的People對(duì)象*/ 
  18.             People people = (People)session.get(People.class, peoplePrimaryKey);  
  19.               
  20.             System.out.println("people age is:"+people.getAge());  
  21.               
  22.             tx.commit();  
  23.         }  
  24.         catch (Exception e)  
  25.         {  
  26.             if(tx != null)  
  27.             {  
  28.                 tx.rollback();  
  29.             }  
  30.               
  31.             e.printStackTrace();  
  32.         }  
  33.         finally 
  34.         {  
  35.             session.close();  
  36.         }  
  37.     }  

控制臺(tái)輸出:

people age is:40

可以看到數(shù)據(jù)成功的取出了。

方式二:將主鍵屬性提取到一個(gè)主鍵類中,實(shí)體類只需包含主鍵類的一個(gè)引用。

主鍵類:

 
 
 
 
  1. /*必須實(shí)現(xiàn)Serializable接口*/ 
  2. public class PeoplePrimaryKey implements Serializable  
  3. {  
  4.     private static final long serialVersionUID = -1190986010439330142L;  
  5.       
  6.     /*復(fù)合主鍵值*/ 
  7.     private String id;  
  8.     private String name;  
  9.       
  10.     public PeoplePrimaryKey()  
  11.     {  
  12.           
  13.     }  
  14.       
  15.     /*復(fù)合主鍵值的get和set方法*/ 
  16.     public String getId()  
  17.     {  
  18.         return id;  
  19.     }  
  20.  
  21.     public void setId(String id)  
  22.     {  
  23.         this.id = id;  
  24.     }  
  25.  
  26.     public String getName()  
  27.     {  
  28.         return name;  
  29.     }  
  30.  
  31.     public void setName(String name)  
  32.     {  
  33.         this.name = name;  
  34.     }  
  35.  
  36.     @Override 
  37.     public int hashCode()  
  38.     {  
  39.         final int prime = 31;  
  40.         int result = 1;  
  41.         result = prime * result + ((id == null) ? 0 : id.hashCode());  
  42.         result = prime * result + ((name == null) ? 0 : name.hashCode());  
  43.         return result;  
  44.     }  
  45.  
  46.     @Override 
  47.     public boolean equals(Object obj)  
  48.     {  
  49.         if (this == obj)  
  50.             return true;  
  51.         if (obj == null)  
  52.             return false;  
  53.         if (getClass() != obj.getClass())  
  54.             return false;  
  55.         PeoplePrimaryKey other = (PeoplePrimaryKey) obj;  
  56.         if (id == null)  
  57.         {  
  58.             if (other.id != null)  
  59.                 return false;  
  60.         }  
  61.         else if (!id.equals(other.id))  
  62.             return false;  
  63.         if (name == null)  
  64.         {  
  65.             if (other.name != null)  
  66.                 return false;  
  67.         }  
  68.         else if (!name.equals(other.name))  
  69.             return false;  
  70.         return true;  
  71.     }  

實(shí)體類:

 
 
 
 
  1. public class People  
  2. {  
  3.     /*持有主鍵類的一個(gè)引用,使用該引用作為這個(gè)類的OID*/ 
  4.     private PeoplePrimaryKey peoplePrimaryKey;  
  5.     private int age;  
  6.       
  7.     public People()  
  8.     {  
  9.           
  10.     }  
  11.       
  12.     public PeoplePrimaryKey getPeoplePrimaryKey()  
  13.     {  
  14.         return peoplePrimaryKey;  
  15.     }  
  16.  
  17.     public void setPeoplePrimaryKey(PeoplePrimaryKey peoplePrimaryKey)  
  18.     {  
  19.         this.peoplePrimaryKey = peoplePrimaryKey;  
  20.     }  
  21.  
  22.     public int getAge()  
  23.     {  
  24.         return age;  
  25.     }  
  26.  
  27.     public void setAge(int age)  
  28.     {  
  29.         this.age = age;  
  30.     }  

People.hbm.xml文件稍有一點(diǎn)變動(dòng):

 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.      
  6.          
  7.          
  8.          
  9.              
  10.              
  11.              
  12.          
  13.  
  14.          
  15.      
  16.  

場(chǎng)景測(cè)試與方式一大同小異這里不再舉例了。主鍵類為什么實(shí)現(xiàn)Serializable接口和為什么重寫equals和hashCode方法上面已經(jīng)解釋的很清楚了。


網(wǎng)站題目:Hibernate復(fù)合主鍵映射
文章分享:http://www.dlmjj.cn/article/cddeiih.html