日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hibernate教程--关联关系的映射详解

發(fā)布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hibernate教程--关联关系的映射详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.1?Hibernate關(guān)聯(lián)關(guān)系的映射

1.1.1?實(shí)體之間的關(guān)系:

實(shí)體之間有三種關(guān)系:

* 一對多:

* 一個用戶,生成多個訂單,每一個訂單只能屬于一個用戶.

* 建表原則:

* 在多的一方創(chuàng)建一個字段,作為外鍵,指向一的一方的主鍵.


* 多對多:

* 一個學(xué)生可以選擇多門課程,一個課程可以被多個學(xué)生選擇.

* 建表原則:

* 創(chuàng)建第三張表,中間表至少有兩個字段,分別作為外鍵指向多對多雙方主鍵.


* 一對一:(特殊.最少.)

* 一個公司只能有一個注冊地址,一個注冊地址,只能被一個公司使用.(否則將兩個表建到一個表.)

* 建表原則:

* 唯一外鍵:

* 一對一的雙方,假設(shè)一方是多的關(guān)系.需要在多的一方創(chuàng)建一個字段,作為外鍵.指向一的一方的主鍵.但是在外鍵添加一個unique.

* 主鍵對應(yīng):

* 一對一的雙方,通過主鍵進(jìn)行關(guān)聯(lián).

?

1.1.2?Hibernate中一對多的配置

第一步:

* 創(chuàng)建兩個實(shí)體:

* 客戶實(shí)體:

public class Customer {private Integer cid;private String cname;// 一個客戶有多個訂單.private Set<Order> orders = new HashSet<Order>();public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}}* 訂單實(shí)體:public class Order {private Integer oid;private String addr;// 訂單屬于某一個客戶.放置一個客戶的對象.private Customer customer;public Integer getOid() {return oid;}public void setOid(Integer oid) {this.oid = oid;}public String getAddr() {return addr;}public void setAddr(String addr) {this.addr = addr;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}}

?

第二步:建立映射:

Customer.hbm.xml

<hibernate-mapping><class name="com.sihai.hibernate3.demo2.Customer" table="customer"><!-- 配置唯一標(biāo)識 --><id name="cid" column="cid"><generator class="native"/></id><!-- 配置普通屬性 --><property name="cname" column="cname" length="20"/><!-- 建立映射 --><!-- 配置一個集合 <set>的name Customer對象中的關(guān)聯(lián)對象的屬性名稱. --><set name="orders"><!-- <key>標(biāo)簽中column:用來描述一對多多的一方的外鍵的名稱. --><key column="cno"></key><!-- 配置一個<one-to-many>標(biāo)簽中class屬性:訂單的類的全路徑 --><one-to-many class="com.sihai.hibernate3.demo2.Order"/></set></class></hibernate-mapping>

?

Order.hbm.xml

<hibernate-mapping><class name="com.sihai.hibernate3.demo2.Order" table="orders"><!-- 配置唯一標(biāo)識 --><id name="oid" column="oid"><generator class="native"/></id><!-- 配置普通屬性 --><property name="addr" column="addr" length="50"/><!-- 配置映射 --><!--<many-to-one>標(biāo)簽name :關(guān)聯(lián)對象的屬性的名稱.column:表中的外鍵名稱.class:關(guān)聯(lián)對象類的全路徑--><many-to-one name="customer" column="cno" class="com.sihai.hibernate3.demo2.Customer"/></class></hibernate-mapping>

?

第三步:將映射放到核心配置文件中.

?

1.1.3?Hibernate中級聯(lián)保存的效果:

級聯(lián):操作當(dāng)前對象的時候,關(guān)聯(lián)的對象如何處理.

?

cascade=”save-update”

級聯(lián)方向性:

* 保存客戶的時候,選擇級聯(lián)訂單.

* 保存訂單的時候,選擇級聯(lián)客戶.

?

1.1.4?Hibernate中級聯(lián)刪除的效果:

cascade=”delete”

1.1.5?Hibernate中的級聯(lián)取值:

none:不使用級聯(lián)

save-update:保存或更新的時候級聯(lián)

delete:刪除的時候級聯(lián)

all:除了孤兒刪除以外的所有級聯(lián).

delete-orphan:孤兒刪除(孤子刪除).

* 僅限于一對多.只有一對多時候,才有父子存在.認(rèn)為一的一方是父親,多的一方是子方.

* 當(dāng)一個客戶與某個訂單解除了關(guān)系.將外鍵置為null.訂單沒有了所屬客戶,相當(dāng)于一個孩子沒有了父親.將這種記錄就刪除了.

all-delete-orphan:包含了孤兒刪除的所有的級聯(lián).

1.1.6?雙向維護(hù)產(chǎn)生多余的SQL:

配置inverse=”true”:在那一端配置.那么那一端放棄了外鍵的維護(hù)權(quán).

* 一般情況下,一的一方去放棄.

?

cascade:操作關(guān)聯(lián)對象.

inverse:控制外鍵的維護(hù).


package com.sihai.hibernate3.demo2;import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import com.sihai.utils.HibernateUtils;/*** 一對多的測試* @author sihai**/ public class HibernateTest2 {@Test// 區(qū)分cascade和inverse// 在Customer.hbm.xml中的<set>上配置 cascade="save-update" inverse="true"public void demo11(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Customer customer = new Customer();customer.setCname("張三");Order order = new Order();order.setAddr("西三旗");customer.getOrders().add(order);// 客戶是否存到數(shù)據(jù)庫:存// 訂單是否存到數(shù)據(jù)庫:存 cascade="save-update".外鍵是null.session.save(customer);tx.commit();session.close();}@Test// 雙向維護(hù):自動更新數(shù)據(jù)庫,產(chǎn)生多余的SQL.// 雙方都有外鍵的維護(hù)能力.必須讓其中一方放棄外鍵的維護(hù)權(quán).(一般情況下都是一的放棄.)public void demo10(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Customer customer = (Customer) session.get(Customer.class, 1);Order order = (Order) session.get(Order.class, 2);customer.getOrders().add(order);order.setCustomer(customer);tx.commit();session.close();}@Test// 孤兒刪除:// 在Customer.hbm.xml中<set>上配置cascade="delete-orhpan"public void demo9(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 讓1號客戶與1號訂單解除關(guān)系:Customer customer = (Customer) session.get(Customer.class, 1);Order order = (Order) session.get(Order.class, 1);customer.getOrders().remove(order);tx.commit();session.close();}@Test// 級聯(lián)刪除:刪除訂單的時候,級聯(lián)刪除客戶.public void demo8(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Order order = (Order) session.get(Order.class, 1);session.delete(order);tx.commit();session.close();}@Test// 級聯(lián)刪除:刪除客戶的時候級聯(lián)刪除訂單.// 在Customer.hbm.xml的<set>標(biāo)簽上配置cascade="delete"public void demo7(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 級聯(lián)刪除:先查詢,在刪除的方式.Customer custoemr = (Customer) session.get(Customer.class, 1);session.delete(custoemr);tx.commit();session.close();}@Test// 刪除一個客戶:// 默認(rèn)的情況下,將外鍵置為null,刪除數(shù)據(jù)記錄.public void demo6(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 刪除的時候有兩種:// 先查詢在刪除的情況:Customer customer = (Customer) session.get(Customer.class, 1);session.delete(customer);tx.commit();session.close();}@Test// 測試對象的導(dǎo)航關(guān)系:public void demo5(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 定義一個客戶:Customer customer = new Customer();customer.setCname("金剛");// 定義三個訂單Order order1 = new Order();order1.setAddr("西三旗");Order order2 = new Order();order2.setAddr("上地");Order order3 = new Order();order3.setAddr("五道口");order1.setCustomer(customer);customer.getOrders().add(order2);customer.getOrders().add(order3);// session.save(order1); // 共發(fā)送4條insert語句:// session.save(customer);// 共發(fā)送3條insert語句:session.save(order2);tx.commit();session.close();}@Test// 保存訂單級聯(lián)客戶.// 在Order.hbm.xml中<many-to-one>配置cascade屬性:級聯(lián)保存public void demo4(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 定義客戶:Customer customer = new Customer();customer.setCname("郭浩");// 定義訂單:Order order = new Order();order.setAddr("西三旗中騰建華");order.setCustomer(customer);customer.getOrders().add(order);// 保存的時候只保存一方:session.save(order);tx.commit();session.close();}@Test// 保存客戶級聯(lián)訂單.// <set>集合是客戶的關(guān)聯(lián)訂單對象的集合.所以在<set>上配置一個屬性:cascade="save-update"public void demo3(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 定義客戶:Customer customer = new Customer();customer.setCname("郭浩");// 定義訂單:Order order = new Order();order.setAddr("西三旗中騰建華");order.setCustomer(customer);customer.getOrders().add(order);// 保存的時候只保存一方:session.save(customer);tx.commit();session.close();}@Test// 保存客戶和訂單的時候,是否可以只保存其中的一方?不行的報一個異常:一個持久態(tài)對象關(guān)聯(lián)一個瞬時的對象.public void demo2(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 定義客戶:Customer customer = new Customer();customer.setCname("金剛");// 定義訂單:Order order = new Order();order.setAddr("五道口");order.setCustomer(customer);customer.getOrders().add(order);// 保存的時候只保存一方:session.save(customer);tx.commit();session.close();}@Test// 向客戶表插入一個客戶,在訂單表中插入兩個訂單.public void demo1(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 定義一個客戶:Customer customer = new Customer();customer.setCname("郭浩");// 定義兩個訂單:Order order1 = new Order();order1.setAddr("西三旗中騰");Order order2 = new Order();order2.setAddr("西三旗金燕龍");// 建立關(guān)系:order1.setCustomer(customer);order2.setCustomer(customer);customer.getOrders().add(order1);customer.getOrders().add(order2);session.save(customer);session.save(order1);session.save(order2);tx.commit();session.close();} }

1.1.7?Hibernate的多對多的配置:

第一步:創(chuàng)建實(shí)體類:

學(xué)生的實(shí)體:

public class Student {private Integer sid;private String sname;// 一個學(xué)生選擇多門課程:private Set<Course> courses = new HashSet<Course>();public Integer getSid() {return sid;}public void setSid(Integer sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Set<Course> getCourses() {return courses;}public void setCourses(Set<Course> courses) {this.courses = courses;}}

課程的實(shí)體:

public class Course {private Integer cid;private String cname;// 一個課程被多個學(xué)生選擇:private Set<Student> students = new HashSet<Student>();public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}

第二步建立映射:

Student.hbm.xml

<hibernate-mapping><class name="com.sihai.hibernate3.demo3.Student" table="student"><!-- 配置唯一標(biāo)識 --><id name="sid" column="sid"><generator class="native"/></id><!-- 配置普通屬性 --><property name="sname" column="sname" length="20"/><!-- 配置關(guān)聯(lián)映射 --><!-- <set>標(biāo)簽 name:對應(yīng)學(xué)生中的課程集合的名稱 table:中間表名稱. --><set name="courses" table="stu_cour"><!-- <key>中column寫 當(dāng)前類在中間表的外鍵.--><key column="sno"></key><!-- <many-to-many>中class:另一方類的全路徑. column:另一方在中間表中外鍵名稱--><many-to-many class="com.sihai.hibernate3.demo3.Course" column="cno"/></set></class></hibernate-mapping>

?

Course.hbm.xml

<hibernate-mapping><class name="com.sihai.hibernate3.demo3.Course" table="course"><!-- 配置唯一標(biāo)識 --><id name="cid" column="cid"><generator class="native"/></id><!-- 配置普通屬性 --><property name="cname" column="cname" length="20"/><!-- 配置與學(xué)生關(guān)聯(lián)映射 --><!-- <set>中name:對應(yīng)當(dāng)前類中的學(xué)生的集合的名稱 table:中間表的名稱--><set name="students" table="stu_cour"><!-- <key>中column:當(dāng)前類在中間表中外鍵 --><key column="cno"></key><!-- <many-to-many>中class:另一方的類全路徑. column:另一方在中間表中外鍵名稱 --><many-to-many class="com.sihai.hibernate3.demo3.Student" column="sno"/></set></class></hibernate-mapping>

?

第三步:將映射文件加入到核心配置文件中:


測試:

package com.sihai.hibernate3.demo3;import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import com.sihai.utils.HibernateUtils;/*** 多對多的測試類:* * @author sihai* */ public class HibernateTest3 {@Test// 多對多的學(xué)生退選.public void demo4(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 查詢一號學(xué)生Student student = (Student) session.get(Student.class, 1);Course course = (Course) session.get(Course.class, 2);student.getCourses().remove(course);tx.commit();session.close();}@Test// 級聯(lián)刪除:在多對多中很少使用.// 刪除:刪除學(xué)生同時刪除學(xué)生關(guān)聯(lián)選課public void demo3(){Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();Student student = (Student) session.get(Student.class, 3);session.delete(student);tx.commit();session.close();}@Test// 級聯(lián)操作:級聯(lián)保存:保存學(xué)生關(guān)聯(lián)課程// 在Student.hbm.xml中配置<set>上 cascade="save-update"public void demo2() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 創(chuàng)建學(xué)生:Student student1 = new Student();student1.setSname("王五");// 創(chuàng)建課程:Course course1 = new Course();course1.setCname("PHP語言");student1.getCourses().add(course1);course1.getStudents().add(student1);session.save(student1);tx.commit();session.close();}@Test// 保存學(xué)生和課程.為學(xué)生選擇一些課程:public void demo1() {Session session = HibernateUtils.openSession();Transaction tx = session.beginTransaction();// 創(chuàng)建學(xué)生:Student student1 = new Student();student1.setSname("張三");Student student2 = new Student();student2.setSname("李四");// 創(chuàng)建課程:Course course1 = new Course();course1.setCname("Java語言");Course course2 = new Course();course2.setCname("Android語言");// 張三選1號和2號課student1.getCourses().add(course1);student1.getCourses().add(course2);course1.getStudents().add(student1);course2.getStudents().add(student1);student2.getCourses().add(course1);course1.getStudents().add(student2);// 執(zhí)行保存:session.save(student1);session.save(student2);session.save(course1);session.save(course2);tx.commit();session.close();} }

總結(jié)

以上是生活随笔為你收集整理的hibernate教程--关联关系的映射详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。