hibernate映射關(guān)系
映射關(guān)系相關(guān)屬性詳解
name:屬性的名字,同時(shí)是對(duì)用類的屬性名字。
table:創(chuàng)建后的表名
class (可選 - 默認(rèn)是通過(guò)反射得到的屬性類型):被關(guān)聯(lián)的類的名字。
column:主鍵對(duì)應(yīng)的屬性名,key標(biāo)簽的colum表示外鍵
-
generator:表示主鍵的生成方式
常見主鍵生成方式
1.increment:主鍵遞增生成,其生成方式與底層數(shù)據(jù)庫(kù)無(wú)關(guān),大部分?jǐn)?shù)據(jù)庫(kù)都支持,該方式的實(shí)現(xiàn)機(jī)制是在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為轉(zhuǎn)。其不足之處是當(dāng)多個(gè)線程并發(fā)對(duì)數(shù)據(jù)庫(kù)表進(jìn)行寫操作時(shí),可能出現(xiàn)相同的主鍵值,發(fā)生主鍵重復(fù)的沖突,所以在多線程并發(fā)操作的時(shí)候不應(yīng)該使用該方法。
<generator class="increment" />2.identity:與底層數(shù)據(jù)庫(kù)有關(guān),要求數(shù)據(jù)庫(kù)支持Identity,如MySQL中auto_increment,SQL Server中的identity。支持的數(shù)據(jù)庫(kù)有MySQL,SQL Server,DB2,Sybase,但是不支持oracle.支持并發(fā)。
<generator class="identity" />3.assigned:主鍵由外部程序負(fù)責(zé)生成,無(wú)需Hibernate參與。----如果要由程序代碼來(lái)指定主鍵,就采有這種。
<generator class="assigned" />4.sequence:使用序列生成主鍵,需要底層數(shù)據(jù)庫(kù)支持
在數(shù)據(jù)庫(kù)中建一個(gè)序列create sequence seq_name increment by 1 start with 1; 在映射文件中指定使用序列的名字 <generator class="sequence"> <param name="sequence">seq_name</param> </generator> property:普通屬性的標(biāo)簽
constrained(約束) (可選):表明該類對(duì)應(yīng)的表對(duì)應(yīng)的數(shù)據(jù)庫(kù)表,和被關(guān)聯(lián)的對(duì)象所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表之間,通過(guò)一個(gè)外鍵引用對(duì)主鍵進(jìn)行約束。
這個(gè)選項(xiàng)影響save()和delete()在級(jí)聯(lián)執(zhí)行時(shí)的先后順序unique:是在使用hibernate的自動(dòng)建表的時(shí)候才用到,uniq="true"用來(lái)指定表中的外鍵唯一,即給表中的外鍵添加唯一性約束,保證是一對(duì)一的關(guān)系。
property-ref:用來(lái)指定關(guān)聯(lián)類的屬性名,這個(gè)屬性將會(huì)和本類中的主鍵相對(duì)應(yīng),如果沒有指定,默認(rèn)使用關(guān)聯(lián)類的主鍵和本類中的主鍵相對(duì)應(yīng)。
lazy:true/false,session是否延遲查詢所需要的對(duì)象的相關(guān)屬性
-
cascade(級(jí)聯(lián)) (可選):表明操作是否從父對(duì)象級(jí)聯(lián)到被關(guān)聯(lián)的對(duì)象。
級(jí)聯(lián)的類型
lazy="none":在保存,更新,刪除當(dāng)前對(duì)象的時(shí)候忽略其他關(guān)聯(lián)的對(duì)象。是cascade的默認(rèn)值
lazy="save-update":當(dāng)通過(guò)Session的save(),update(),saveOrUpdate()方法來(lái)保存或者更新當(dāng)前對(duì)象的時(shí)候級(jí)聯(lián)保存所有關(guān)聯(lián)的臨時(shí)對(duì)象,級(jí)聯(lián)更新所有關(guān)聯(lián)的游離對(duì)象。
lazy="delete":當(dāng)通過(guò)Session的delete()方法刪除當(dāng)前對(duì)象的時(shí)候級(jí)聯(lián)刪除所有關(guān)聯(lián)的對(duì)象。
lazy="all":包含save-update和delete的行為。
lazy="delete-orphan":刪除所有和當(dāng)前對(duì)象解除關(guān)聯(lián)關(guān)系的對(duì)象。(只能在set中配置)
lazy="all-delete-orphan": 包含all和delete-orphan的行為
inverse:負(fù)責(zé)控制關(guān)系,inverse真正的作用是指定由哪一方來(lái)維護(hù)之間的關(guān)聯(lián)關(guān)系,當(dāng)一方指定inverse="false"那么這一方就有責(zé)任負(fù)責(zé)之間的關(guān)聯(lián)關(guān)系。.需要將其中的一方inverse="true",默認(rèn)為false,只能顯示在<set>放進(jìn)行設(shè)置。
映射關(guān)系類型
-
一對(duì)一
一個(gè)人對(duì)應(yīng)一張身份證,一張身份證對(duì)應(yīng)一個(gè)人
person配置文件信息:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2one"> <class name="Person" table="tbl_person"> <id name="id" column="id"> <generator class="increment" /> </id> <property name="name" /> <!-- 在主方配置一對(duì)一 --> <one-to-one name="card" class="Card" /> </class> </hibernate-mapping>
card配置文件信息:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.briup.day05.one2one">
<class name="Card" table="tbl_card">
<id name="id" column="id">
<generator class="increment" />
</id>
<property name="number"/>
<property name="address"/>
<many-to-one name="person" class="Person"
unique="true"
column="p_id"></many-to-one>
<!-- column是外鍵 -->
</class>
</hibernate-mapping>
-
一對(duì)多
一位顧客對(duì)應(yīng)多個(gè)訂單,多個(gè)訂單對(duì)應(yīng)一位顧客
customer配置文件信息:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2many"> <class name="Customer" table="tbl_customer"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="name"/> <property name="telephone"/> <property name="address"/> <!-- 關(guān)聯(lián)映射 --> <set name="orders"> <key column="c_id"/> <one-to-many class="Order"/> </set> </class> </hibernate-mapping> *order配置文件信息:* <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day05.one2many"> <class name="Order" table="tbl_order"> <id name="id" column="id"> <generator class="increment"/> </id> <property name="total"/> <property name="orderDate"/> <!-- 關(guān)聯(lián)映射 --> <many-to-one name="customer" class="Customer" column="c_id" /> </class> </hibernate-mapping> -
多對(duì)多
多個(gè)學(xué)生對(duì)應(yīng)多門課程,多門課程對(duì)應(yīng)對(duì)個(gè)學(xué)生
由于student和course都是多對(duì)多所以配置信息一樣:
配置文件信息:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.briup.day06.many2many"> <class name="Student" table="tbl_student"> <id name="id" column="id"> <generator class="increment" /> </id> <property name="name" /> <property name="age" /> <set name="courses" table="tbl_student_course"> <key column="s_id"> </key> <many-to-many class="Course" column="c_id"></many-to-many> </set> </class> </hibernate-mapping> 在上面的配置文件中出現(xiàn)了一個(gè)table="tab_student_course"這樣的標(biāo)簽,那么這個(gè)是什么呢?
在數(shù)據(jù)庫(kù)中如果兩個(gè)不同的實(shí)體出現(xiàn)了多對(duì)多的關(guān)系我們要給其中添加一個(gè)關(guān)系的對(duì)應(yīng)表,我們稱之為橋表,那么這里的table="tab_student_course"就是學(xué)生表和課程對(duì)應(yīng)的橋表