hibernate教程--关联关系的映射
1.1Hibernate關(guān)聯(lián)關(guān)系的映射
1.1.1實體之間的關(guān)系:
實體之間有三種關(guān)系:
* 一對多:
* 一個用戶,生成多個訂單,每一個訂單只能屬于一個用戶.
* 建表原則:
* 在多的一方創(chuàng)建一個字段,作為外鍵,指向一的一方的主鍵.
* 多對多:
* 一個學(xué)生可以選擇多門課程,一個課程可以被多個學(xué)生選擇.
* 建表原則:
* 創(chuàng)建第三張表,中間表至少有兩個字段,分別作為外鍵指向多對多雙方主鍵.
* 一對一:(特殊.最少.)
* 一個公司只能有一個注冊地址,一個注冊地址,只能被一個公司使用.(否則將兩個表建到一個表.)
* 建表原則:
* 唯一外鍵:
* 一對一的雙方,假設(shè)一方是多的關(guān)系.需要在多的一方創(chuàng)建一個字段,作為外鍵.指向一的一方的主鍵.但是在外鍵添加一個unique.
* 主鍵對應(yīng):
* 一對一的雙方,通過主鍵進行關(guān)聯(lián).
1.1.2Hibernate中一對多的配置
第一步:
* 創(chuàng)建兩個實體:
* 客戶實體:
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;}}* 訂單實體: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"><!-- 配置唯一標識 --><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>標簽中column:用來描述一對多多的一方的外鍵的名稱. --><key column="cno"></key><!-- 配置一個<one-to-many>標簽中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"><!-- 配置唯一標識 --><id name="oid" column="oid"><generator class="native"/></id><!-- 配置普通屬性 --><property name="addr" column="addr" length="50"/><!-- 配置映射 --><!--<many-to-one>標簽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.3Hibernate中級聯(lián)保存的效果:
級聯(lián):操作當前對象的時候,關(guān)聯(lián)的對象如何處理.
cascade=”save-update”
級聯(lián)方向性:
* 保存客戶的時候,選擇級聯(lián)訂單.
* 保存訂單的時候,選擇級聯(lián)客戶.
1.1.4Hibernate中級聯(lián)刪除的效果:
cascade=”delete”
1.1.5Hibernate中的級聯(lián)取值:
none:不使用級聯(lián)
save-update:保存或更新的時候級聯(lián)
delete:刪除的時候級聯(lián)
all:除了孤兒刪除以外的所有級聯(lián).
delete-orphan:孤兒刪除(孤子刪除).
* 僅限于一對多.只有一對多時候,才有父子存在.認為一的一方是父親,多的一方是子方.
* 當一個客戶與某個訂單解除了關(guān)系.將外鍵置為null.訂單沒有了所屬客戶,相當于一個孩子沒有了父親.將這種記錄就刪除了.
all-delete-orphan:包含了孤兒刪除的所有的級聯(lián).
1.1.6雙向維護產(chǎn)生多余的SQL:
配置inverse=”true”:在那一端配置.那么那一端放棄了外鍵的維護權(quán).
* 一般情況下,一的一方去放棄.
cascade:操作關(guān)聯(lián)對象.
inverse:控制外鍵的維護.
1.1.7Hibernate的多對多的配置:
第一步:創(chuàng)建實體類:
學(xué)生的實體:
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;}}課程的實體:
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"><!-- 配置唯一標識 --><id name="sid" column="sid"><generator class="native"/></id><!-- 配置普通屬性 --><property name="sname" column="sname" length="20"/><!-- 配置關(guān)聯(lián)映射 --><!-- <set>標簽 name:對應(yīng)學(xué)生中的課程集合的名稱 table:中間表名稱. --><set name="courses" table="stu_cour"><!-- <key>中column寫 當前類在中間表的外鍵.--><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"><!-- 配置唯一標識 --><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)當前類中的學(xué)生的集合的名稱 table:中間表的名稱--><set name="students" table="stu_cour"><!-- <key>中column:當前類在中間表中外鍵 --><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();} }
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的hibernate教程--关联关系的映射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hibernate教程--一级缓存详解
- 下一篇: hibernate教程--关联关系的映射