Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的關(guān)聯(lián)映射?
簡單來說Hibernate是ORM映射的持久層框架,全稱是(Object Relational Mapping),即對象關(guān)系映射。
它將數(shù)據(jù)庫中的表映射成對應(yīng)的對象,以對象的形式展現(xiàn),這樣我們就可以通過映射的對象來對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行間接的操作。
關(guān)聯(lián)映射是將數(shù)據(jù)庫中的表映射成與之相對應(yīng)的對象,當(dāng)你對這個對象進(jìn)行操作的時候,Hibernate會對數(shù)據(jù)庫中對應(yīng)的表執(zhí)行相應(yīng)的操作,你對該實體的操作實際上就是在間接的操作數(shù)據(jù)庫中與之相對應(yīng)的表。
Hibernate正是實現(xiàn)了這種思想,達(dá)到了方便開發(fā)人員以面向?qū)ο蟮乃枷雭韺崿F(xiàn)對數(shù)據(jù)庫的操作。?
Hibernate主要實現(xiàn)的映射關(guān)系:
?
Hibernate映射的基本結(jié)構(gòu)
? ?hibernate在實現(xiàn)ORM功能的時候主要用到的文件有:映射類(*.Java)、映射文件(*.hbm.xml)和數(shù)據(jù)庫配置文件(*.properties/*.cfg.xml),它們各自的作用如下。
? ? ? ? 映射類(*.java):它是描述數(shù)據(jù)庫表的結(jié)構(gòu),表中的字段在類中被描述成屬性,將來就可以實現(xiàn)把表中的記錄映射成為該類的對象了。
? ? ? ? 映射文件(*.hbm.xml):它是指定數(shù)據(jù)庫表和映射類之間的關(guān)系,包括映射類和數(shù)據(jù)庫表的對應(yīng)關(guān)系、表字段和類屬性類型的對應(yīng)關(guān)系以及表字段和類屬性名稱的對應(yīng)關(guān)系等。
? ? ? ? 數(shù)據(jù)庫配置文件(*.properties/*.cfg.xml):它是指定與數(shù)據(jù)庫連接時需要的連接信息,比如連接哪種數(shù)據(jù)庫、登錄數(shù)據(jù)庫的用戶名、登錄密碼以及連接字符串等。當(dāng)然還可以把映射類的地址映射信息放在這里。
?
hibernate中的關(guān)聯(lián)關(guān)系有四種:一對一、一對多、多對一、多對多。
?
關(guān)聯(lián)關(guān)系中又分為單向關(guān)聯(lián)與雙向關(guān)聯(lián)
?
單向關(guān)聯(lián):單向關(guān)聯(lián)是指只有一方有另一方的關(guān)聯(lián)信息而另一方?jīng)]有關(guān)聯(lián)信息 ? ? ? ? ? ? ? ? ?
?
例:
?
A——>B??
?
A對象中有B對象的關(guān)聯(lián)信息
?
B對象中沒有A對象的關(guān)聯(lián)信息
?
我們可以通過A對象中B的關(guān)聯(lián)信息查詢或修改B對象的信息但無法通過B對象來查詢修改A對象的信息
?
同理A<——B也是單向關(guān)聯(lián)
?
這種只是單方面的關(guān)聯(lián)我們稱為單向關(guān)聯(lián)
?
??雙向關(guān)聯(lián):雙向關(guān)聯(lián)是指兩方都有另一方的關(guān)聯(lián)信息
?
例:
?
A<——>B
?
A對象中有B對象的關(guān)聯(lián)信息
?
B對象中也有A對象的關(guān)聯(lián)信息
?
我們可以通過A對象中B的關(guān)聯(lián)信息查詢或修改B對象的信息也可以通過B對象來查詢修改A對象的信息
?
這種兩方都有另一方的關(guān)聯(lián)信息我們稱為雙向關(guān)聯(lián)
?
單向關(guān)聯(lián)一般在一方配置多方不進(jìn)行配置
如:一對多 單向關(guān)聯(lián)在“一”的一方配置文件里進(jìn)行配置,"多"的一方不進(jìn)行配置
雙向關(guān)聯(lián)兩方都要配置
如:一對多 雙向關(guān)聯(lián)在“一”的一方配置文件里需要配置,“多”的一方也需要進(jìn)行配置
通過下面的代碼會慢慢了解
?
下面我們來詳細(xì)了解一下一對一、一對多、多對一、多對多的單向和雙向關(guān)聯(lián):
?
?
一對一關(guān)聯(lián)映射
?
?
一對一關(guān)聯(lián):一對一是指一個對象對應(yīng)一個對象 ?如:一個人只有一個身份證。
在兩個數(shù)據(jù)表之間的一對一關(guān)系可以有兩種實現(xiàn)方法,其中一種就是通過兩個表的主鍵相關(guān)聯(lián),另一種是通過外鍵相關(guān)聯(lián)
如:一個人(Person)對應(yīng)一個地址(Address)代碼如下。
一對一主鍵單向關(guān)聯(lián):
Person——>Address
?
public class Person {private int personid;private String name;private int age;//在Person對象中有Address對象的關(guān)聯(lián)信息private Address address;public class Address{//Address對象中沒有Person對象的關(guān)聯(lián)信息private int addressid;private String addressdetail;?
?
?
這種單方面有另一個對象的關(guān)聯(lián)信息的時候我們稱為單向關(guān)聯(lián),再來看一下兩個表中的映射hbm.xml文件:
?
Person.hbm.xml<hibernate-mapping><class name="com.entity.Person" table="PERSON"><id name="personid" column="presonid"> <!--基于主鍵關(guān)聯(lián)時,主鍵生成策略是foreign,表明根據(jù)關(guān)聯(lián)類生成主鍵--><generator class="foreign"><!--關(guān)聯(lián)持久化類的屬性名--><param name="property">address</param></generator></id><property name="name"/><property name="age"/><!--constrained設(shè)定為true,表示的主鍵必須與Person中對應(yīng)資料的主鍵相同。--><one-to-one name="address" constrained="true"/></class> </hibernate-mapping>
單向關(guān)聯(lián)和雙向關(guān)聯(lián)的區(qū)別主要在于單向只在一方配置而雙向兩方都要配置
Address.hbm.xml?
因為是單方面關(guān)聯(lián)所以只在Person.hbm.xml中配置了關(guān)聯(lián)信息而Address.hbm.xml中不做任何配置
所以我們省略Address.hbm.xml
…………
?
?
知道了一對一的單向關(guān)聯(lián),我們再來了解一下一對一的雙向關(guān)聯(lián),雙向關(guān)聯(lián)結(jié)合上面的知識可能聰明的小伙伴已經(jīng)想到了。下面我們來看一下一對一的雙向關(guān)聯(lián)
一對一主鍵雙向關(guān)聯(lián):
Person<——>Address
?
public class Person implements java.io.Serializable { private Long id; private String name; //雙向關(guān)聯(lián)中Person對象中有Adderss對象的關(guān)聯(lián)信息 private Address address;public class Address implements java.io.Serializable { private Long id; //Adderss對象中也有Person對象的關(guān)聯(lián)信息 private Person person; private String detail;?
?
?
這種兩方面都有另一個對象的關(guān)聯(lián)信息的時候我們稱為雙向關(guān)聯(lián),再來看一下兩個表中的映射hbm.xml文件:
?
Person.hbm.xml<hibernate-mapping> <class name="entity.Person" table="person"> <id name="id" type="java.lang.Long"> <column name="id" /> <generator class="identity" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="24" not-null="true"> <comment>姓名</comment> </column> </property> <one-to-one name="address"/> </class> </hibernate-mapping>
?
??
單向關(guān)聯(lián)和雙向關(guān)聯(lián)的區(qū)別主要在于單向只在一方配置而雙向兩方都要配置Address.hbm.xml
<hibernate-mapping> <class name="entity.Address" table="address" catalog="mydb"> <id name="id" type="java.lang.Long"> <column name="id" /> <!-- class="foreign": 一對一主鍵映射中,使用另外一個相關(guān)聯(lián)的對象的標(biāo)識符 --> <generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="detail" type="java.lang.String"> <column name="detail" length="120" not-null="true"> <comment>詳細(xì)地址</comment> </column> </property> <!-- 表示在address表存在一個外鍵約束,外鍵參考相關(guān)聯(lián)的表person --> <one-to-one name="person" constrained="true" /> </class> </hibernate-mapping>
?當(dāng)我們操作Person對象時,可以對Address對象進(jìn)行操作,也可以操作Address對象時對Person對象進(jìn)行操作這樣就形成了雙向的關(guān)聯(lián)
?
?
雙向關(guān)聯(lián)還需要在hibernate.cfg.xml中進(jìn)行配置
<hibernate-configuration> <session-factory> <property name="connection.username">root</property> <property name="connection.url"> jdbc:mysql://localhost:3306/testdb </property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.password">xiaohui</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="show_sql">true</property> <property name="format_sql">true</property><!--在hibernate.cfg.xml中配置hbm.xml文件--><mapping resource="com/entity/Person.hbm.xml" /> <mapping resource="com/entity/Address.hbm.xml" /> </session-factory> </hibernate-configuration>
?
?
我們再來看一下一對一的外鍵關(guān)聯(lián)
一對一外鍵單向關(guān)聯(lián):
Person——>Address
public class Person {private int personid;private String name;private int age;private Address address;public class Address{private int addressid;private String addressdetail;?
?
?
雙向和單向關(guān)聯(lián)大家應(yīng)該已經(jīng)了解了 這里就不多做介紹了直接上代碼:
Address.hbm.xml<!--address中不做任何配置所以我們省略-->
…………………………
<!--單向關(guān)聯(lián)和雙向關(guān)聯(lián)的區(qū)別在于單向關(guān)聯(lián)只在一方配置雙向關(guān)聯(lián)兩方都要配置--> Person.hbm.xml <hibernate-mapping> <class name="com.entity.Person" table="PERSON"> <id name="personid"> <generator class="identity"/> </id> <property name="name"/> <property name="age"/> <!--用來映射關(guān)聯(lián)PO column是Address在該表中的外鍵列名,增加unique變成唯一的--> <many-to-one name="address" unique="true"/> </class> </hibernate-mapping>
外鍵關(guān)聯(lián)和主鍵關(guān)聯(lián)不同的地方是采用<many-to-one>標(biāo)簽來映射,一對一唯一外鍵關(guān)聯(lián)映射其實是多對一的特例。<many-to-one>指定多的一端unique為true,這樣就限制了多的一端的多重性為一,就是這樣來映射的。
?
?
一對一外鍵雙向關(guān)聯(lián):
Person<——>Address
public class Person implements java.io.Serializable { private Long id; private String name; private Address address;public class Address implements java.io.Serializable { private Long id; private Person person; private String detail;?
Person.hbm.xml <hibernate-mapping> <class name="com.entity.Person" table="person"> <id name="personid" type="java.lang.Long"> <column name="personid" /> <generator class="identity" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="24" not-null="true"> <comment>姓名</comment> </column> </property><!--雙向關(guān)聯(lián)配置--><one-to-one name="address" /> </class> </hibernate-mapping>Address.hbm.xml <hibernate-mapping> <class name="com.entity.Address" table="address" catalog="testdb"> <id name="addressid" type="java.lang.Long"> <column name="addressid" /> <generator class="identity" /> </id> <property name="detail" type="java.lang.String"> <column name="detail" length="120" not-null="true"> <comment>詳細(xì)地址</comment> </column> </property> <many-to-one name="person" class="entity.Person" unique="true"> <column name="personid"> <comment>人的ID</comment> </column> </many-to-one> </class> </hibernate-mapping> 單向關(guān)聯(lián)和雙向關(guān)聯(lián)的區(qū)別主要在于單向只在一方配置而雙向兩方都要配置所以一對一雙向關(guān)聯(lián)比單向關(guān)聯(lián)多了一個在Person.hbm.xml文件中配置<one-to-one name="address" />
?雙向關(guān)聯(lián)還需要在hibernate.cfg.xml中進(jìn)行配置
<hibernate-configuration> <session-factory> <property name="connection.username">root</property> <property name="connection.url"> jdbc:mysql://localhost:3306/testdb </property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <property name="connection.password">xiaohui</property> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <property name="show_sql">true</property> <property name="format_sql">true</property> <!--在hibernate.cfg.xml中配置hbm.xml文件--><mapping resource="com/entity/Person.hbm.xml" /> <mapping resource="com/entity/Address.hbm.xml" /> </session-factory> </hibernate-configuration>?注意:因為一對一的主鍵關(guān)聯(lián)映射擴(kuò)展性不好,當(dāng)我們的需要發(fā)生改變想要將其變?yōu)橐粚Χ嗟臅r候變無法操作了,所以我們遇到一對一關(guān)聯(lián)的時候經(jīng)常會采用唯一外鍵關(guān)聯(lián)來解決問題,而很少使用一對一主鍵關(guān)聯(lián)。
?
? 一對多關(guān)聯(lián)映射
? 一對多關(guān)聯(lián):一對多是指一個對象對應(yīng)多個對象 同樣也分為單向關(guān)聯(lián)和雙向關(guān)聯(lián) 如:一個教室可以有多個學(xué)生
一對多單向關(guān)聯(lián):
Classes——>Student
public class Classes { private int id; private String name; //Set支持延遲加載因為多個學(xué)生所以我們用Set集合關(guān)聯(lián) private Set students; } public class Student { private int id; private String name; }?
單向關(guān)聯(lián)只需在一方配置hbm.xml文件Student不需要配置所以就省略了
Classes對象中使用了set屬性,但是只是說明了延遲加載的屬性,并沒有為屬性配置對應(yīng)的對象,屬性的對象是要在映射文件中來配置的,需要添加set標(biāo)簽,并在set標(biāo)簽中添加<one-to-many>標(biāo)簽,具體如下代碼:
Classes.hbm.xml
<hibernate-mapping> <class name="com.hibernate.Classes" table="t_classes"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="students"> <key column="classesid"></key> <one-to-many class="com.hibernate.Student"></one-to-many> </set> </class> </hibernate-mapping>?
因為Classes一方是一方對應(yīng)的Student是多方 所以我們要用<set>來關(guān)聯(lián)一方
Student.hbm.xml不做任何改變
省略………………
?
? 一對多雙向關(guān)聯(lián):
? Classes<——>Student
public class Classes { private int id; private String name; //Set支持延遲加載 private Set<Student> students; } public class Student { private int id; private String name; //添加class對象關(guān)聯(lián)信息因為是一方所以我們用一個對象關(guān)聯(lián)private Classes classes; }?
Classes.hbm.xml
因為與單向一對多配置一樣所以就省略了 可以參考上面單向一對多的代碼
Student.hbm.xml
雙向我們需要兩方都要配置代碼如下:
<hibernate-mapping> <class name="com.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 在多的一端Student中添加一行新的Classes列 ,并且列的名稱要和Classes.hbm.xml的列明相同--> <many-to-one name="classes" column="classesid"></many-to-one> </class> </hibernate-mapping>?
?
?因為Student一方是多方對應(yīng)的Classes是一方 所以我們要用<many-to-one>來關(guān)聯(lián)一方
?
多對多關(guān)聯(lián)映射
多對多關(guān)聯(lián):多對多關(guān)聯(lián)是指多個對象對應(yīng)多個對象 如:老師可以有多個學(xué)生,學(xué)生也可以有多個老師
?多對多單向關(guān)聯(lián):
Teacher——>Student
public class Teacher {private int id;private String name;private Set<Student> students = new HashSet<Student>(); }public class Student {private int id;private String name;private String title; }?
Teacher.hbm.xml
?
<hibernate-mapping> <class name="com.hibernate.Teacher" table="t_teacher"> <id name="id"> <generator class="native"/> </id> <property name="name"/><!--生成一張新表存放兩個關(guān)聯(lián)對象的ID--><set name="students" table="Teacher_Sutdent">
<!--將Teacher表的外鍵關(guān)聯(lián) 注意不是對象的屬性是表中的字段--><key column="teacher_id"></key>
<!--將Student表的外鍵關(guān)聯(lián) 注意不是對象的屬性是表中的字段-->
<many-to-many class="com.hibernate.Student" column="student_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
?
?
文件中要使用<many-to-many>標(biāo)簽,并且在標(biāo)簽中添加上對應(yīng)的列關(guān)系,因為你要讓兩個對象中都要清楚它們之間的映射是如何使用的,并且在生成的關(guān)系表中哪一列是對應(yīng)的自己的外鍵,所以要在該標(biāo)簽中指明,另外在<set>標(biāo)簽中添加table屬性會指明要生成新表,下面的示例中添加了t_user_role,所以會生成新的關(guān)聯(lián)表。
Student.hbm.xml不做任何配置所以省略
…………
多對多雙向關(guān)聯(lián):
Teacher<——>Student
?
public class Teacher {private int id;private String name;private Set<Student> students = new HashSet<Student>(); }public class Student {private int id;private String name;private String title;private Set<Teacher> teachers = new HashSet<Teacher>(); }?
?
?
Teacher.hbm.xml同單向多對多一樣故省略
…………
Student.hbm.xml
<hibernate-mapping> <class name="com.hibernate.Student" table="t_student"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!--生成一張新表存放兩個表的Id--><set name="teachers" table="Teacher_Student"> <!--將Teacher表的外鍵關(guān)聯(lián) 注意不是對象的屬性是表中的字段--><key column="student_id"></key> <!--將Student表的外鍵關(guān)聯(lián) 注意不是對象的屬性是表中的字段--> <many-to-many class="com.hibernate.Teacher" column="teacher_id"></many-to-many> </set> </class> </hibernate-mapping>?
?
?
多對一關(guān)聯(lián)
?對比一對一關(guān)聯(lián)映射和多對一唯一外鍵關(guān)聯(lián)映射,其實它們兩個都是使用了<many-to-one>本質(zhì)上都是外鍵約束,只不過一對一的是唯一映射,需要添加unique="true"的屬性,其它的它們兩個是相同的。
多對一關(guān)聯(lián):多對一關(guān)聯(lián)是指多個對象對應(yīng)一個對象 如:多個員工對應(yīng)一個部門
?多對一單向關(guān)聯(lián):
public class Department { private int id; private String name; } public class Employee { private int id; private String name; private Department depart;//注意這里是以部門的對象來作為員工的屬性的,這個思想很關(guān)鍵,是建立起部門和員工關(guān)聯(lián)的關(guān)鍵 }?
Department.hbm.xml不做任何配置故省略
…………
Employee.hbm.xml
<hibernate-mapping package="com.suo.domain"> <class name="Employee"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="depart"></many-to-one> <!-- many-to-one指明了外鍵 ,會根據(jù)反射機(jī)制,找到要和Employee建立多對一關(guān)系的類,該列默認(rèn)的是可以為空的--> </class> </hibernate-mapping>?
? 多對一雙向關(guān)聯(lián):
public class Department { private int id; private String name;private Set<Employee> emps;//用集合來存儲員工 } public class Employee { private int id; private String name; private Department depart;//注意這里是以部門的對象來作為員工的屬性的,這個思想很關(guān)鍵,是建立起部門和員工關(guān)聯(lián)的關(guān)鍵 }?
Departement .hbm.xml
<hibernate-mapping package="com.suo.domain"> <class name="Department"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="emps"> <key column="depart_id"/><!-- key指明了員工表中的外鍵--> <one-to-many class="Employee"/><!-- one-to-many指明了和哪個類進(jìn)行一對多的映射 --> </set> <!-- 用set標(biāo)簽表示Department中的員工集合的屬性,這個屬性并沒有映射到數(shù)據(jù)庫中的部門表中, 即部門表中,并沒有emps這樣的一個列。 --> </class> </hibernate-mapping>?
Employee.hbm.xml同單向關(guān)聯(lián)配置相同故省略
…………
?
? ? ? ?級聯(lián)操作 Cascade:
?一.簡單的介紹
cascade和inverse (Employee – Department)
l? Casade用來說明當(dāng)對主對象進(jìn)行某種操作時是否對其關(guān)聯(lián)的從對象也作類似的操作,常用的cascade:
???????? none,all,save-update,delete, lock,refresh,evict,replicate,persist,
???????? merge,delete-orphan(one-to-many)。
一般對many-to-one,many-to-many不設(shè)置級聯(lián),
??在<one-to-one>和<one-to-many>中設(shè)置級聯(lián)。
l? inverse表“是否放棄維護(hù)關(guān)聯(lián)關(guān)系”(在Java里兩個對象產(chǎn)生關(guān)聯(lián)時,對數(shù)據(jù)庫表的影響),在one-to-many和many-to-many的集合定義中使用,inverse=”true”表示該對象不維護(hù)關(guān)聯(lián)關(guān)系;
該屬性的值一般在使用有序集合時設(shè)置成false(注意hibernate的缺省值是false)。
???????? one-to-many維護(hù)關(guān)聯(lián)關(guān)系就是更新外鍵。many-to-many維護(hù)關(guān)聯(lián)關(guān)系就是在中間表增減記錄。
???????? 注: 配置成one-to-one的對象不維護(hù)關(guān)聯(lián)關(guān)系
?
二,屬性的解析
class元素的lazy屬性設(shè)定為true,表示延遲加載,如果lazy設(shè)為false,則表示立即加載。以下對這二點進(jìn)行說明。
???? 立即加載:表示Hibernate在從數(shù)據(jù)庫中取得數(shù)據(jù)組裝好一個對象(如學(xué)生1)后,?會立即再從數(shù)據(jù)庫取得數(shù)據(jù)組裝此對象所關(guān)聯(lián)的對象(如學(xué)生證1)。
???? 延遲加載:表示Hibernate在從數(shù)據(jù)庫中取得數(shù)據(jù)組裝好一個對象(如學(xué)生1)后,不會立即再從數(shù)據(jù)庫中取得數(shù)據(jù)組裝此對象所關(guān)聯(lián)的對象(如學(xué)生1),而是等到需要時,才會從數(shù)據(jù)庫取得數(shù)據(jù)組裝此關(guān)聯(lián)對象。
?
<one-to-one>元素的cascade屬性表明操作是否從父對象級聯(lián)到被關(guān)聯(lián)的對象,
它的取得可以是以下幾種:
???? none:在保存,刪除或修改當(dāng)前對象時,不對其附屬對象(關(guān)聯(lián)對象)進(jìn)行級聯(lián)操作。它是默認(rèn)值。
???? save-update:在保存,更新當(dāng)前對象時,級聯(lián)保存,更新附屬對象(臨時對象,游離對象)。
???? delete:在刪除當(dāng)前對象時,級聯(lián)刪除附屬對象。
???? all:所有情況下均進(jìn)行級聯(lián)操作,即包含save-update和delete操作。
???? delete-orphan:刪除和當(dāng)前對象解除關(guān)系的附屬對象。
<one-to-one>元素的fetch屬性的可選值是join和select,默認(rèn)是select。當(dāng)fetch屬性設(shè)定為join時,表示連接抓取(Join fetching):Hibernate通過在Select語句中使用outer join(外連接)來獲得對象的關(guān)聯(lián)實例或者關(guān)聯(lián)集合。
當(dāng)fetch屬性設(shè)定為select時,表示查詢抓取(Select fetching):需要另外發(fā)送一條Select語句抓取當(dāng)前對象的關(guān)聯(lián)實體或集合。
三。代碼練習(xí)
<set name="emps" cascade="save-update">
?<key column="depart_id"/>
? <one-to-many class="Employee"/>
</set>
<set name="students" table="taacher_student" inverse="true"><!-- table是用來指定中間表的屬性 -->
<key column="teacher_id"></key><!-- 查找教師id時,鏈接中間表表的teacher_id -->
<many-to-many class="Student" column="student_id"></many-to-many>
</set>
關(guān)系映射總結(jié):
?
單向關(guān)聯(lián)
一對一主鍵關(guān)聯(lián):單向關(guān)聯(lián)時我們需要在有關(guān)聯(lián)信息一方的配置文件里加入<one-to-one ?constrained="true">并且將constrained屬性設(shè)置為true?表示的主鍵必須與這個對象中對應(yīng)資料的主鍵相同
?
一對一外鍵關(guān)聯(lián):單向關(guān)聯(lián)時我們需要在有關(guān)聯(lián)信息一方的配置文件里加入<many-to-one unique="true">并且將unique屬性設(shè)置為true 表示這個主鍵是唯一的
一對多單向關(guān)聯(lián):單向關(guān)聯(lián)時我們需要在有關(guān)聯(lián)信息一方的配置文件里加入<set>在<set>中加入<one-to-many/>
<set>
<key column="關(guān)聯(lián)的外鍵">
<one-to-many/>
</set>
多對多單向關(guān)聯(lián):單向關(guān)聯(lián)時我們需要在有關(guān)聯(lián)信息一方的配置文件里加入<set>在<set 中生成一張新表用來存放兩個表的外鍵table="">中加入<key column="當(dāng)前表的外鍵ID"><many-to-many clasee="關(guān)聯(lián)對象路徑" column="關(guān)聯(lián)對象表的Id">
<set table="">
<key column=""/>
<many-to-many class="" column="">
</set>
多對一單向關(guān)聯(lián):單向關(guān)聯(lián)時我們需要在有關(guān)聯(lián)信息一方的配置文件里加入<many-to-one>
?
雙向關(guān)聯(lián)
一對一主鍵關(guān)聯(lián):在從表的一方加入<one-to-one constrained="true">還需要在主表加入<one-to-one>
?一對一外鍵關(guān)聯(lián):除了在從表中加入<many-to-one unique="true">也需要在主表加入<one-to-one>
?一對多雙向關(guān)聯(lián):除了在一方中加入<set><one-to-many></set>還需要在多放加入<many-to-one>
?多對多雙向關(guān)聯(lián):需要在兩方都加入<set><many-to-many></set> ?注:<set>中的table="表名" ? 表明兩方的配置要一樣
?
<set name="關(guān)聯(lián)對象的屬性名" table="生成一張新表">
<key column="當(dāng)前對象數(shù)據(jù)庫表的外鍵"/>
<many-to-many class="關(guān)聯(lián)對象的類路徑" column="關(guān)聯(lián)對象數(shù)據(jù)庫表的外鍵">
</set>
多對一雙向關(guān)聯(lián):要在多方中加入<many-to-one>還要在一方中加入<set>
<set>
<key column="關(guān)聯(lián)外鍵"/>
<one-to-many>
</set>
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/hcl22/p/6103254.html
總結(jié)
以上是生活随笔為你收集整理的Java三大框架之——Hibernate关联映射与级联操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 钥匙
- 下一篇: java美元兑换,(Java实现) 美元