1. Hibernate Annotation關係映射有下面幾種類型:
1)一對一外鍵關聯映射(單向)
2)一對一外鍵關聯映射(雙向)
3)一對一主鍵關聯映射(不重要)在這不演示
在實際中很少用,使用註解@PrimaryKeyJoinColumn
意思是說,我的主鍵去參考另外一張表中的主鍵,作爲我的主鍵,但是在我測試使用
註解一對一主鍵關聯映射,在生成表的時候,數據庫中並沒有生成關聯,使用XML
映射可以生成。Annotation註解一對一主鍵關聯映,有些bug。不過沒空去研究它。
因爲在實際開發中一對一很少用。在實際開發中我機會沒有用過,主鍵關聯就更少了
4)多對一關聯映射
5)一對多關聯映射(單向)
6)一對多關聯映射(雙向)
7)多對多關聯映射(單向)
8)多對多關聯映射(雙向)
2.介紹各種映射用法
1)一對一外鍵關聯映射(單向)
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="userid",unique=true)
//一對一外鍵關聯,使用@OneToOne,並設置了級聯操作
//@JoinColum設置了外鍵的名稱爲userid(數據庫字段名),如果不設置,則默認爲另一類的屬性名+ _id
//外鍵的值是唯一的(unique),不可重複,與另一類的主鍵一直
2)一對一外鍵關聯映射(雙向)
Class1裏與上面一樣,
Class2:
@OneToOne(mappedBy="class2",cascade=CascadeType.ALL)
//一對一雙向關聯關係,使用@OneToOne
//注意:需要加上mappedBy="class2",如果不加上的話,
//Class2也會生成一個外鍵(class1_id)
//mappedby="class2"需要指向與他關聯對象的一個屬性
//說明雙向關聯關係中,有且僅有一端是作爲主體(owner)端存在的
//主體端負責維護聯接列
//對於不需要維護這種關係的從表則通過mappedBy屬性進行聲明
//mappedBy的值指向主體的關聯屬性
//規律:只有是雙向關聯關係,都加上mappedby
//cascade=CascadeType.ALL級聯
4)多對一關聯映射
在多的一端配置:
@ManyToOne(targetEntity=Organization.class)
@JoinColumn(name="orgid")
//多對一註解@ManyToOne
//targetEntity指定了關聯對象
//@JoinColumn(name="orgid")指定生產的外鍵的字段名,默認是org_id
5)一對多關聯映射(單向)
@OneToMany
@JoinColumn(name="orgid")
/**
* 一對多註解@OneToMany(單向)
* 如果只寫@OneToMany的話,hibernate會建一張中間表來
* 維護他們之間的關係,
* 加上@JoinColumn(name="orgid"),則不會建中間表,他會在
* 多的一端加上外鍵orgid,來維護他們之間的關係
*/
6)一對多關聯映射(雙向)
一端:
@OneToMany(mappedBy="org")
@JoinColumn(name="orgid")
/**
* 一對多雙向,在一的一端中設置mappedBy
* 說明多的一端爲主導
* 如果指定了外鍵字段名稱,則多的一端也需要指定相同的字段名稱
*/
多端:
@ManyToOne
@JoinColumn(name="orgid")
/**
* 一對多雙向
* 需要指定外鍵與一的一端給的外鍵名稱一致,@JoinColumn(name="orgid")
* 也可以不指定,如果在多的一端不指定,則一的一端也不能指定
* 否則爲生成兩個外鍵
*/
7)多對多關聯映射(單向)
@ManyToMany
/**
* 多對多映射:註解@ManyToMany(單向)
* 默認情況下,hibernate會自動的創建一張中間表,
* 來維護多對多關係
* 默認中間表的名稱 :user_role中間表,字段的名稱user_id role_id
* 如果想更換表名和字段名稱,註解如下:
*/
@JoinTable(name="t_u_r",
joinColumns={@JoinColumn(name="u_id")},
inverseJoinColumns={@JoinColumn(name="r_id")}
)
8)多對多關聯映射(雙向) User端
@ManyToMany
/**
* 多對多映射:註解@ManyToMany(單向)
* 默認情況下,hibernate會自動的創建一張中間表,
* 來維護多對多關係
* 默認中間表的名稱 :user_role中間表,字段的名稱user_id role_id
* 如果想更換表名和字段名稱,註解如下:
*/
@JoinTable(name="t_u_r",
joinColumns={@JoinColumn(name="u_id")},
inverseJoinColumns={@JoinColumn(name="r_id")}
)
/**
* @JoinTable(name="t_u_r",
* 指定中間表的表名
* joinColumns={@JoinColumn(name="u_id")},
* 指定當前對象的外鍵
* inverseJoinColumns={@JoinColumn(name="r_id")}
* 指定關聯對象的外鍵
*/
Role端
@ManyToMany(mappedBy="role")
/**
* 多對多,雙向關聯映射
*/