映射分四種類型:java
一對多 多對一 一對一 多對多mysql
1、單向一對多sql
什麼是一對多的關係呢?數據庫
就像班級和學生。站在班級的角度看。班級和學生就是一對多的關係。單向的session
那怎麼樣實現這種關係呢?app
1.在數據庫中,能夠經過添加主外鍵的關聯,表現一對多的關係;ide
2.在java中,經過在一方持有多方的集合實現,即在「一」的一端中使用<set>元素表示持有「多」的一端的對象。性能
![CDATA[這裏放置須要顯示的字符]]>ui
數據庫鏈接URL,使用CDATA包含是爲了避免讓解析CDATA內部的特殊符號 如"&",若是不用CDATA則用"&"來代替"&"spa
//hibernate4.3的初始化用於會話的獲取和關閉: public class HibernateUtil { private static SessionFactory sessionFactory; private static Session session; static { //建立configuration對象,讀取hibernate.cfg.xml文件,完成初始化 Configuration config = new Configuration().configure(); StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(config.getProperties()); StandardServiceRegistry ssr = ssrb.build(); sessionFactory = config.buildSessionFactory(ssr); } //獲取SessionFactory對象 public static SessionFactory getsessionFactory() { return sessionFactory; } //獲取Session對象 public static Session getSession() { return sessionFactory.openSession(); } //關閉Session對象 public static void closeSession(Session session) { if (session != null) { session.close(); } } }
CREATE TABLE grade ( gid INT PRIMARY KEY, gname VARCHAR(20) NOT NULL, gdesc VARCHAR(50) ); CREATE TABLE student ( sid INT PRIMARY KEY, sname VARCHAR(20) NOT NULL, sex CHAR(2), gid INT ); ALTER TABLE student ADD CONSTRAINT fk_student_gid FOREIGN KEY (gid) REFERENCES grade(gid);
建立持久化類和映射文件並配置單向一對多關係
a.持久化類
1.建立學生持久化類
2.建立班級持久化類(在一方定義一個多方集合)
b.配置映射文件
<class name="com.entity.Grade" table="grade"> <id name="gid" column="gid" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="gname" type="java.lang.String"> <column name="gname" not-null="true" length="20"></column> </property> <property name="gdesc" type="java.lang.String"> <column name="gdesc"></column> </property> <!-- 配置單向一對多關係 --> <set name="一方實體類定義的多方的引用,即集合屬性students" table="多方的表名student"> <key column="關聯外鍵的列gid"></key> <one-to-many class="多方實體類的全類名com.entity.Student"></one> </set> </class>
<class name="com.entity.Student" table="student"> <id name="sid" column="sid" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="sname" type="java.lang.String"> <column name="sname" not-null="true" length="20"></column> </property> <property name="sex"> <column name="sex"></column> </property> </class>
c.在hibernate.cfg.xml中配置
<!-- 指定映射文件 -->
<mapping resource="com/entity/Grade.hbm.xml"></mapping>
<mapping resource="com/entity/Student.hbm.xml"></mapping>
映射文件中set元素的經常使用屬性
2、單向多對一
單向多對一關聯:
一、多對一的關係和關係數據庫中的外鍵參照關係最匹配,即在己方(多方)的表中的一個外鍵參照另外一個表的主鍵;
二、經過在多方持有一方的引用實現,須要在「多」的一端使用<many-to-one>配置
單向多對一的配置:
一、在多方定義一方的引用 添加屬性 private Grade grade; 添加get、set方法
二、在多方持久類的映射文件中添加 <many-to-one class name="指定對一方的引用,實際上就是一方引用定義的屬性" class="一方對應的持久化類,即關聯實體類,全類名" cloumn="外鍵的列名" ></many-to-one>
(注意:無需在一方添加關聯映射,即set元素)
3、inverse屬性和cascade屬性
inverse屬性:
一、一方的hbm.xml文件的<set>節點的inverse屬性指定了關聯關係的控制方向,默認由one方來維護;
二、關聯關係中,inverse="false"則爲主動方,由主動方負責維護關聯關係;
三、在一對多關聯中,設置one方的inverse爲true,這將有助於性能的改善。
cascade屬性:
一、當設置了cascade屬性不爲none時,Hibernate會自動持久化所關聯的對象;
二、cascade屬性的設置會帶來性能上的變更,須要謹慎設置;
————————————————————————————
屬性值 含義和做用
all 對全部操做進行級聯操做
save-update 執行保存和更新操做時進行級聯操做
delete 執行刪除時進行級聯操做
none 對全部操做不進行級聯操做
————————————————
說明:舉個例子,見截圖:
在向Grade添加Student後,保存Grade對象時,能不能不須要顯示的保存Student對象,答案是能夠的,可使用級聯操做:在Grade的映射文件中的<set>節點添加cascade屬性不爲none,爲"save-update".