Hibernate對映配置檔案基本詳細配置
<?xml version="1.0" encoding="UTF-8" ?>
<!--
引入hibernate核心包下的org.hibernate的對映檔案的約束
-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--
根據約束檔案建立根標籤
auto-import 是查詢這個對映類的檔案的時候是按照類路徑進行查詢的
lazy 是設定是否延遲載入,預設是true,設定為false則是立即載入
◆對映的標籤也是可以設定的
-->
<hibernate-mapping auto-import="true" lazy="false">
<!--
class 根據一個類進行對映
name 是類的類路徑
table 是需要進行對映的表
-->
<class name="com.hibernate._01configurefile.Student" table="_student">
<!--
<id>是定義這個表的主鍵對映
name 是類的屬性
column 是表的欄位名
-->
<id name="id" column="id">
<!--
genetator 是定義這個id的值是如何建立的
class 是定義主鍵進行建立的方式
方式一;自行維護
assigned 是開發人員給的,
如果開發人員沒有對主鍵進行賦值則自動賦值,
1但是是從0開始,並且是隻會賦值一次。
方式二;底層資料庫維護
identity 針對sql資料庫的
squence 針對orcle資料庫的
native 自適應
方式三;hibernate框架維護
increment 是根據最大的id+1進行計算的
uuid 是底層生成一個uuid的,
但是必須要是字元型別或者文字型別
◆注;如果主鍵是使用自生成的,
那麼這個主鍵第一個值必須要是這個自動生成的規則,
如;第一個必須是1
並且有一些是手動設定以及是失效的,只會使用自生成的值
-->
<generator class="identity"></generator>
</id>
<!--
property 是定於類的屬性和表字段直接的關係,
如果表的欄位和類的屬性名是一樣的則不需要寫column預設是一樣的
name 是對映類的屬性名
column 是表的對映欄位名
type 則是需要存入資料庫的型別
length 則是可以存入資料庫的大小
因為在<id>中定義了主鍵所以不需要在<property>中再次定義
在hibernate框架中對資料庫的操作有三種資料庫儲存型別,
每一種資料型別都是一一對應的。
java hibernate MySql
java.lang.String stringstring/text/clob
java.lang.byte binary blob
-->
<property name="name"></property>
<property name="age" column="age"></property>
<property name="date" column="date" type="java.util.Date"></property>
<!-- ◆◆◆ 在對檔案進行操作的時候建議檢查資料庫的資料型別和存放的大小 ◆◆◆ -->
<!-- 對字元檔案進行操作 -->
<property name="charFile" column="charFile" type="string" length="2000000"></property>
<!-- 對位元組檔案進行操作 -->
<property name="bytes" column="butes" type="binary" length="2000000"></property>
<!-- 集合對映 -->
<!--
配置Set對映
name 是進行對映類的Set屬性名
table 是這個對映集合的表名
-->
<set name="set" table="s_set">
<!--
key 是設定這個表與主表的外來鍵關聯鍵
-->
<key column="s_id"></key>
<!--
element 是定義這個表,存放資料的欄位
-->
<element column="address" type="string"></element>
</set>
<!--
list 是設定這個表的List屬性的副表
name 對映類中的list名
table 是這個副表的名
-->
<list name="list" table="l_list">
<!--
key 是設定這個表與主表的外來鍵
cloumn 是這個外來鍵的欄位名
-->
<key column="s_id"></key>
<!--
因為List集合是一個有序的所以需要定義一個list索引值,
因為id如果進行了刪除那麼則會出現斷層
column 是定義這個索引值的欄位名
-->
<list-index column="list_i"></list-index>
<!--
element 是設定這副表的存放資料的欄位
column 是欄位名
-->
<element column="address_l" type="string"></element>
</list>
<!--
map 是定義對映類中的Map集合
name 是對映類的Map集合屬性名
table 是定義這個對映類的表的表名
-->
<map name="map" table="m_map">
<!--
key 是定義這個表的與主表的外來鍵
column 是定義這個外來鍵的欄位名
-->
<key column="s_id"></key>
<!--
因為map 集合是有一個key的所以則使用map-key標籤
column 是定義這key的欄位名
type 是定義這個欄位的型別,·····必須
-->
<map-key column="map_key" type="string"></map-key>
<!--
element 是定義欄位名
column 是定義這個欄位名
-->
<element column="map_value" type="string"></element>
</map>
----------- 物件對映 ---------------
<!--
+----------------> 多對一對映;單向
| 設定對一方的配置
|name 當前這個一方位於多方類中屬性名
|class 是這個多方類的類路徑
|column 是這個多方法位於表的外來鍵欄位
|cascade 是設定這個2個表之間的級聯,
|在寫到程式碼的時候可以省略一點,在刪除,
|修改等操作則會自動對映到一方的表也進行這樣的操作。
|可是如果有多個對映到一方表中的某一個數據,那麼則在刪除的時候則要關閉級聯。
|save-update 是儲存和更新
|delete 是刪除
|all 是所有
結none 關閉,預設
合-->
就<many-to-one name="person"
是class="com.levi._02m_t_o_single.Person"
雙column="p_id"
向></many-to-one>
|
|
|<!--
|配置多方的對映
|cascade 是配置這個2個表之間的外來鍵級聯
|save-update 儲存和修改級聯
|delete 刪除級聯
|all 所有
|none 預設是沒有
|-->
|<!--
+-------------> 一對多對映;單向
在資料進行儲存的時候出現了2次的update。
因為這個update的出現是因為在insert的時候那個外來鍵是空的,
從而在後面才需要補上去。
在一對多的關聯中是由一方進行維護這個關聯關係的,
而這個關聯關係的建立是依靠外來鍵的。
而這個關聯關係是由誰維護則是誰儲存則是由誰維護的,
所以一方會主動的把自己的主鍵的值再次進行更新到外來鍵表的外來鍵欄位中,
由此產生了2個update語句。
但是可以通過設定inverse(反轉)屬性,
用於將這個關聯維護關係,主動的轉換給被的表
inverse 預設是false,不轉讓出去,需要設定為true
◆預設在一方
-->
<set name="orders" cascade="all" inverse="true">
<!-- 設定這個一方類位於這個多方表的外來鍵 -->
<key column="c_id"></key>
<!--
配置物件對映關係
class 配置這個多方類的類路徑
-->
<one-to-many class="com.levi._03o_t_m_single.Orders" ></one-to-many>
</set>
<!--
+-------------> 多對多對映;雙向
|配置物件對映,table 是中間表的表名
|cascade 是設定這個關聯
|save-update 儲存/修改
|delete 刪除
|all 所有
|none 關閉級聯,預設
|
|inverse 設定和外來鍵維護控制權給另外的一個對映,
|因為在多對多的對映中會出現同時2個維護
|-->
|<set name="student" table="n_stu_tea" cascade="all" inverse="true">
多
對<!-- 設定當前這個表的外來鍵 -->
多<key column="t_id"></key>
雙
向<!--
|設定這個表的對映
|column 是設定這個class屬性對應的類的外來鍵值
|-->
|<many-to-many class="com.levi._05m_t_m_double.Student"
|column="s_id"></many-to-many>
|</set>
|
|<!--
+-------------> 多對多對映;雙向
設定物件對映
name 是屬性名
table 是中間表
-->
<set name="teacher" table="n_stu_tea">
<!-- 設定當前這個表的位於中間表的外來鍵 -->
<key column="s_id"></key>
<!-- 設定關聯表,column是設定這個關聯表的外來鍵 -->
<many-to-many class="com.levi._05m_t_m_double.Teacher"
column="t_id">
</many-to-many>
</set>
<!--
+-------------> 一對一對映;雙向 —— 主表
|設定對映,因為外來鍵是不在Person表的
|-->
<one-to-one name="idcard"
|class="com.levi._06o_t_o_double.IdCard"
|cascade="all"></one-to-one>
|
|<!--
| 一對一對映;雙向 —— 副表
+------------>方式一;使用一對多(多對一)雙向;
|必須要設定外來鍵是唯一的,
一這是一個特殊的一對一。
對
一
映-->
射<!-- <many-to-one name="person"
雙 class="com.levi._06o_t_o_double.Person"
向column="p_id"
|cascade="all"
|unique="true"></many-to-one>-->
|<!--
| 一對一對映;雙向 —— 副表
|
+------------> 方式二;主鍵作為外來鍵
-->
<one-to-one name="person"
class="com.levi._06o_t_o_double.Person"
cascade="all"
constrained="true">
</one-to-one>
</class>
</hibernate-mapping>