hibernate聯合主鍵生成策略以及一對多配置

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的。 

二。一對多關聯 
    我原先的設置是這樣的,這是個錯誤的配置。 

Java代碼  
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name="authorities", 
joinColumns=@JoinColumn(name="username")) 
public Set getGrantedAuthorities() { 
        return grantedAuthorities; 
}

    這樣配置最後在生成表的時候,User和Authorities關聯會多出來兩個列"grantedAuthorities_username"和"grantedAuthorities_password"並且在使用過程中會出錯。 
    正確的配置如下: 
Java代碼  
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinColumn(name="username") 
public Set getGrantedAuthorities() { 
        return grantedAuthorities; 

    這樣Authorities表中的username屬性就被正確的和User表中的username關聯起來的。 

*重要的提示! 
    順帶一提的事這個JoinColumn的意義是從表(Authority)中的這個字段(username)和主表(User)的主鍵(username這個不是配置裏面的那個username要注意哦!)相互關聯。 



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