實體關係映射
一對一關聯:1、主鍵關聯 從表的主鍵同時是主表的外鍵,從表沒有單獨外鍵
2、外鍵關聯 從表中存在外鍵列,關聯主表的外鍵列。但外鍵列是不重複的。
級聯操作(all,none,delete,save-update)當前對象執行某操作的情況下, 有關聯的對象也執行cascade設置的相同操作
cascade和inverse的區別
cascade表示級聯操作,當主表記錄做操作時,從表記錄做相應的操作,維護的是記錄。
inverse表示控制反轉,當該屬性設置爲true,表示由關聯對象維護外鍵關係,當前對象不做外鍵維護,維護的是外鍵。一般來說,inverse設置在一方,外鍵由從表維護。
一對一:
<!-- name爲屬性名,class爲該屬性的類型,cascade表示當對主表對象操作時,從表對象是否做級聯操作 -->
<one-to-one name="codeBean" class="com.joker.bean.CodeBean"cascade="all"></one-to-one>
<!-- constrained表示該主鍵存在外鍵約束,lazy=false表示取消延遲加載,查詢該對象時,關聯對象立即查詢 -->
<one-to-one name="manBean" class="com.joker.bean.ManBean"constrained="true" lazy="false"></one-to-one>
一對一的從表主鍵如何配置:<id name="id" column="id">
<!-- 主鍵生成策略,foreign鏢師該主鍵同時也是外鍵 -->
<generatorclass="foreign">
<!-- manBean爲屬性名,表示該主鍵ManBean對象的主鍵生成 -->
<paramname="property">manBean</param>
</generator>
</id>
<!-- 主表:配置一對多,指定集合存放元素的類型 -->
<setname="prodSet" inverse="true">
<keycolumn="factoryId"></key>
<one-to-many class="com.lovo.RoomBean" />
</set>
<!--從表: 配置多對一,指定集合存放元素的類型 -->
<many-to-onename="user" class="com.lovo.bean.UserBean"
column="userId"lazy="false"></many-to-one>
多對多關係映射:
<!-- talbe爲中間表表名 -->
<setname="gradeSet" table="t_role_grade">
<!-- 當前對象對應中間表的外鍵列名 -->
<keycolumn="roleId"></key>
<many-to-manyclass="com.lovo.bean.GradeBean"
column="gradeId"/>
</set>
註解註冊:
一對一
@OneToOne(mappedBy="manBean",cascade=CascadeType.ALL) |
mappedBy表示當前屬性映射的從表對象的關聯屬性名,cascade表示是否做級聯刪除 |
@JoinColumn(name="manId",unique=true) |
name爲外鍵列名,unique表示唯一外鍵關聯 |
一對多
@OneToMany(targetEntity=RoomBean.class) |
targetentity指定集合中存放元素類型 |
@JoinColumn(name="userId") |
指定外鍵列名 |
多對一
@ManyToOne(fetch=FetchType.EAGER) |
fetch=FetchType.EAGER表示立即加載,查詢從表記錄時立即查詢主表對象 |
@JoinColumn(name="userId") |
指定外鍵列名 |
@ManyToMany(targetEntity=GradeBean.class) |
|
@JoinTable(name="t_role_grade",joinColumns={@JoinColumn(name="roleId")}, inverseJoinColumns={@JoinColumn(name="gradeId")}) |
指定中間表的表名,當前對象對應中間表的外鍵列名,集合中存放元素對應中間愛表的外鍵列名 |