1:一般能用一個字段做主鍵的就不要用兩個字段,不過不可避免的會遇到要用兩個字段做主鍵,此時要用hibernate,可以使用聯合主鍵。如圖:要用id和name做主鍵
辦法:單獨設計一個類,起名StudentPK,在該類必須重寫equals,hashcode,實現Serializable接口。
此時在Student類中可以刪除掉id和name的屬性及get/set方法,但是必須加入新的屬性,該屬性的類型是StudentPK,如:private StudentPK pk;然後生成get/set方法,此時要想存一個Student,首先:new一個StudentPK,然後如圖:
此時還不夠,還必須在配置文件中告訴你哪個是主鍵?
ps:
爲什麼實現serise接口?因爲ser是序列化的,是將該類序列化然後寫到硬盤上的。
作爲student這個對象,它在數據庫表中可能存在着多條記錄,這多條記錄如果我們把它放到內存裏的話就是多個對象,這多個對象,假如現在被放到了內存中都是student,那麼你可以想象每個student對象都有一個主鍵對象(StudentPK),假如要做集羣,有多臺服務器,這臺宕機了,我們可以序列化,還有一種情況,內存滿了,我可以使用虛擬內存,就是把我們硬盤上的一部分空間作爲內存來使用,在這種情況下,我們就可以把上面那些內容暫時放到要硬盤上去,所以這個時候就需要實現序列化了。
如圖:
爲什麼要重寫equals?
保證唯一性。放到內存之後很多student對象,裏面都有自己的studentPK,這個時候如何區分?
而且重寫時不能亂寫。
爲什麼要重寫hashcode?
因爲假如說,如果說我們這個對象,它被裝在內存的hash表裏面,查詢時會首先查hashcode,
什麼是hash表?
實際上就是一張表格,也可以是數組。hash表在底層很多是數組來實現的。
一對多
需求:
1.有一個User類,有如下屬性:
String username; //PK
String password;
Set grantedAuthority; //一對多關聯到Authorities
2.有一個Authorities,有如下屬性:
String username; //主鍵1
String authority; //主鍵2
要實現如註釋所示的表關係。
做法:
一。聯合主鍵的製作
網上有三種方法,我用的是@IdClass標籤的方法。
需要爲聯合主鍵多做一個類AuthoritiesPK(需要實現Serializable接口)來實現主鍵的聯合,其中屬性只需要有聯合主鍵的字段就行了,並且爲它們實現get和set方法,這個類不需要做任何的annotation標記。
另一個Authorities類在@Entity標記下面添加一個@IdClass(AuthoritiesPK.class),括號裏面的是前面那個新建的類。然後再在Authorities類中的主鍵的get方法前添加@Id標籤就可以了。
*別忘了mapping文件,只要對User和Authorities兩個類做映射就行了,不用做那個AuthoritiesPK的。
二。一對多關聯
我原先的設置是這樣的,這是個錯誤的配置。
正確的配置如下:
*重要的提示!
順帶一提的事這個JoinColumn的意義是從表(Authority)中的這個字段(username)和主表(User)的主鍵(username這個不是配置裏面的那個username要注意哦!)相互關聯。