1. 程式人生 > >hibernate的映射關系

hibernate的映射關系

tor native assign update bsp end lan tco java

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的映射關系