hibernate的映射關系
1集合映射
一個買家對應多個地址
Set集合的配置
<!--接下來我們應該配置的是我們的集合映射 set集合-->
<set name="addresses" table="t_address">
<!--這裏的這個key相當於是要配置外鍵 那麽這個外鍵 是會自動的映射到當前的class的主鍵-->
<!-- 下面的這個 u_id 會自動的映射成上面的主鍵的id值-->
<key column="u_id"></key>
<!--下面的這個列專門用來存放地址
下面記住因為是集合所以集合中的數據的數據類型必須要寫 否則報錯
-->
<element column="address" type="java.lang.String"></element>
</set>
List集合配置
<!--接下來我們應該配置的是我們的集合映射 list集合-->
<list name="addresses" table="t_address_list">
<!--配置的是我們的外鍵-->
<key column="u_id"></key>
<!--下面就是和set集合唯一區別 下面這個配置表示的是排序的列-->
<list-index column="indexs"></list-index>
<!--配置的是實質映射的字段-->
<element column="address" type="java.lang.String"></element>
</list>
Map集合的配置
<!--下面就是map集合的映射-->
<map name="addresses" table="t_address_map">
<key column="u_id"></key>
<map-key column="keys_001" type="java.lang.String"></map-key>
<element column="address" type="java.lang.String"></element>
</map>
註意:
1——在使用集合映射的時候 首先要掌握 必須要給定集合中的數據的數據類型 否則報錯
2——在使用我們的List集合的是時候 需要給我們的List集合提供排序的列(必須的)
3——在使用map集合的時候 需要在集合映射表中添加key的映射字段
4——在集合中的<key></key> 這個表示的是集合要引用的鍵 這個外鍵是自動完成映射的
外鍵會主動的映射到我們的實體的主鍵中去
一對多映射配置文件:
<!--下面就配置的是一對多的集合映射-->
<set name="emps" table="t_employee" cascade="save-update,delete">
<!--集合中的外鍵會自動的映射到上面的主鍵-->
<key column="dept_id"></key>
<one-to-many class="Employ"/>
</set>
2 多對一映射配置文件:
<many-to-one name="dept" class="Dept" column="dept_id"></many-to-one>
註意:實際開發中不需要兩邊配置,而且一般實際中都是多維護一
級聯的問題 cascade
<set name="emps" table="t_employee" cascade="save-update">
<!--集合中的外鍵會自動的映射到上面的主鍵-->
<key column="dept_id"></key>
<one-to-many class="Employ"/>
</set>
cascade:級聯 級聯有三種 :save-update 級聯的保存和更新 delete 級聯的刪除 all(前面兩個家夥的並集)
級聯的保存和更新是可以用的 但是在開發中一般情況下 級聯的刪除是不會用到的 因為他會影響到多張表
4多對多的關聯映射
一個程序員可以開發多個項目 程序員----->項目(一對多的關系)
一個項目是由多個開發人員來進行開發 項目----->程序員(一對多的關系)
綜上所述 兩個一對多的關系就構成了 多對多的關系
Project的一方的配置
<!--配置的是多對多的集合映射-->
<set name="devs" table="t_relation" cascade="all">
<!--上面的這個key你記住就是映射的當前的類的主鍵-->
<key column="pro_id"></key>
<!--配置的是相關聯的另外一張表
column:配置的是對方的主鍵在關系表中映射的這個值的列名
class:配置的是對方的這個名字
-->
<many-to-many column="dev_id" class="Developer"></many-to-many>
</set>
Developer一方的配置
<!--配置的是多對多的集合映射-->
<set name="pros" table="t_relation" cascade="all">
<!--上面的這個key你記住就是映射的當前的類的主鍵-->
<key column="dev_id"></key>
<!--配置的是相關聯的另外一張表
column:配置的是對方的主鍵在關系表中映射的這個值的列名
class:配置的是對方的這個名字
-->
<many-to-many column="pro_id" class="Project"></many-to-many>
</set>
5 繼承映射
1 普通的繼承映射
需求:現在有動物(Animal這個類) 還有Dog這個類 和 Fish這個類 要求使用繼承映射來完成這個關聯關系的配置
<hibernate-mapping package="com.qf.extend2">
<class name="Dog" table="t_dog">
<!--配置的是表裏面的主鍵-->
<id name="id" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<property name="num"></property>
</class>
</hibernate-mapping>
2 所有自類個父類對應一張表
分類:首先得有分類 只有有了分類之後那麽這個才知道是誰的數據
表的字段應該包含所有的字段
<hibernate-mapping package="com.qf.extend3">
<class name="Animal" table="t_animal_01">
<!--配置的是表裏面的主鍵-->
<id name="id" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!-- 下面就配置一個非公共的 -->
<!--首先的整個分類
下面這個就是分類的這個列
-->
<discriminator column="type_" length="30" type="string"></discriminator>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<!--分別來配置我們的 dog 和 fish了-->
<subclass name="Dog" discriminator-value="dog_">
<!--要給這個孩子配置個類型-->
<property name="num" type="string"></property>
</subclass>
<!--配置魚的信息-->
<subclass name="Fish" discriminator-value="fish_">
<property name="fishCoatCount" type="java.lang.Integer"></property>
</subclass>
</class>
</hibernate-mapping>
3所有類都對應表
1>:要實現分表的話那麽首先要 將Anianl的主鍵自增長給我改了...
2>:使用的是join-class來完成分表的
<hibernate-mapping package="com.qf.extend4">
<class name="Animal" table="t_animal_02">
<!--配置的是表裏面的主鍵-->
<id name="id" type="string">
<generator class="assigned">
</generator>
</id>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<!--接下來就是配置我們的分表了-->
<joined-subclass name="Dog" table="t_dog_02">
<!--這裏的key會自動的映射到上面class的主鍵上面去-->
<key column="id"></key>
<!--配置的是其他的列-->
<property name="num"></property>
</joined-subclass>
<!--接下來配置我們的fish-->
<joined-subclass name="Fish" table="t_fish_02">
<!--這裏的key會自動的映射到上面class的主鍵上面去-->
<key column="id"></key>
<!--配置的是其他的列-->
<property name="fishCoatCount"></property>
</joined-subclass>
</class>
</hibernate-mapping>
4 父類不對應表,子類都對應
為什麽不用第一種呢?因為第一種要編寫很多的配置文件 不好使...
<hibernate-mapping package="com.qf.extend5">
<!-- abstract="true":這個表示的是不對應表 -->
<class name="Animal" abstract="true">
<!--配置的是表裏面的主鍵-->
<id name="id" type="string">
<generator class="assigned">
</generator>
</id>
<!--配置的是普通的列-->
<property name="color"></property>
<property name="name"></property>
<!--接下來就是配置加表的問題-->
<union-subclass name="Dog" table="t_dog_03">
<property name="num"></property>
</union-subclass>
<!--下面就配置魚了-->
<union-subclass name="Fish" table="t_fish_03">
<property name="fishCoatCount"></property>
</union-subclass>
</class>
</hibernate-mapping>
6一對一映射
需求:人和身份證的問題
一個人 只有一個身份證
一個身份證是不是也只是對應了 一個人
人----->身份證 一對一的關系
身份證------>人 一對一的關系
身份證的配置
<hibernate-mapping package="com.qf.one2one">
<class name="IdCard" table="t_idcard">
<!--配置的是表裏面的主鍵-->
<id name="cardId" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!--配置的是普通的列-->
<property name="cardNum"></property>
<!--下面配置的是引用主鍵的這一方-->
<many-to-one name="people" column="p_id" class="People" cascade="all"></many-to-one>
</class>
</hibernate-mapping>
People的配置
<hibernate-mapping package="com.qf.one2one">
<class name="People" table="t_people">
<!--配置的是表裏面的主鍵-->
<id name="pId" type="java.lang.Integer">
<generator class="native">
</generator>
</id>
<!--配置的是普通的列-->
<property name="name"></property>
<!--接下來應該配置一對一的映射-->
<one-to-one name="idCard" class="IdCard" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
把第一個的主鍵作為第二個的主鍵
hibernate的映射關系