Hibernate学习4—关联关系一对多映射2
生活随笔
收集整理的這篇文章主要介紹了
Hibernate学习4—关联关系一对多映射2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第四節:班級學生一對多映射實現(雙向) 查詢班級的時候能夠獲取所有的學生; 在上一節的基礎之上;我們在Class端也保存學生的關系; com.cy.model.Class: public class Class {private long id;private String name;private Set<Student> students = new HashSet<Student>();public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}
}
Class.hbm.xml:
<hibernate-mapping package="com.cy.model"><class name="Class" table="t_class"><id name="id" column="classId"><generator class="identity"></generator></id><property name="name" column="className"></property><set name="students" cascade="save-update"><!-- key外鍵,column是對應Student表的外鍵classId 就是many-to-one中的column;--><key column="classId"></key><!-- class就是students屬性,對應的集合中裝的類Student --><one-to-many class="com.cy.model.Student"/></set></class> </hibernate-mapping>com.cy.model.Student還和之前一樣:
package com.cy.model;public class Student {private long id;private String name;private Class c;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Class getC() {return c;}public void setC(Class c) {this.c = c;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + "]";}} View CodeStudent.hbm.xml還和之前一樣:
<hibernate-mapping package="com.cy.model"><class name="Student" table="t_student"><id name="id" column="stuId"><generator class="identity"></generator></id><property name="name" column="stuName"></property><many-to-one name="c" column="classId" class="com.cy.model.Class" cascade="save-update"></many-to-one></class> </hibernate-mapping> View Code測試代碼StudentTest:
@Testpublic void testSaveClassAndStudent() {Class c = new Class();c.setName("08計本");Student s1 = new Student();s1.setName("張三");Student s2 = new Student();s2.setName("李四");c.getStudents().add(s1);c.getStudents().add(s2);//這里因為保存Class時,class引用了臨時狀態的s1、s2;會保存失敗//必須在Class.hbm.xml中配置<set name="students" cascade="save-update"級聯保存更新才可以。 session.save(c); }/*** 通過班級端,查找學生*/@Testpublic void getStudentsByClass() {Class c = (Class) session.get(Class.class, Long.valueOf(2));Set<Student> students = c.getStudents();Iterator<Student> it = students.iterator();while(it.hasNext()){Student s = it.next();System.out.println(s);}//Student [id=1, name=李四]//Student [id=2, name=張三]}保存成功!查詢成功!
發出的sql:
?
?
第五節:inverse 屬性 inverse屬性主要是在一對多、多對一雙向關系中,由一端來維護主外鍵關系; 測試代碼: @Testpublic void testAdd(){Class c=new Class();c.setName("09計本");Student s1=new Student();s1.setName("王五");session.save(c);session.save(s1);}@Testpublic void testInverse(){/*** Class和Student都是從session中獲取的,都已經是持久化對象;* 對著兩個持久化對象進行學生設置班級、班級也設置學生* 持久化對象設置關系,hibernate session檢測到之后就會進行持久化操作(同步數據庫)*/Class c=(Class)session.get(Class.class, Long.valueOf(1));Student s=(Student)session.get(Student.class, Long.valueOf(1));s.setC(c);c.getStudents().add(s);/*** 可以看到學生設置班級、班級添加學生,兩端都維護了這個關系,都維護了這個外鍵。引入inverse屬性,只在某一端維護這個主外鍵關系。通常是在多的一端(one-to-many)設置inverse屬性。這里就是在學生Student端添加inverse=true屬性*/}1.先執行testAdd,再執行testInverse:
由于對student、class兩個持久化的對象進行,互設關系的操作,hibernate session檢測到之后就會進行持久化操作(同步數據庫):
確實數據庫發現已經設置了外鍵關系,打印:
?
兩端都來維護這個關系,發出兩條sql語句,有點冗余,引入inverse:
Class.hbm.xml:
<hibernate-mapping package="com.cy.model"><class name="Class" table="t_class"><id name="id" column="classId"><generator class="identity"></generator></id><property name="name" column="className"></property><set name="students" cascade="save-update" inverse="true"><!-- key外鍵,column是對應Student表的外鍵classId 就是many-to-one中的column;--><key column="classId"></key><!-- class就是students屬性,對應的集合中裝的類Student --><one-to-many class="com.cy.model.Student"/></set></class> </hibernate-mapping>2.再次先執行testAdd,再執行testInverse:
只有一條sql了,只在多的一方來維護這個外鍵關系;
?
?
?
第六節:級聯刪除 刪除班級的時候,我們把學生也刪掉; /*** 級聯刪除* 刪除班級的時候,級聯刪除學生*/@Testpublic void testDeleteClassCascade(){Class c=(Class)session.get(Class.class, Long.valueOf(1));session.delete(c);} View Code 默認是不能級聯刪除的,因為刪除class的時候,classId被student表外鍵關聯; 會報錯:?
設置cascade=delete就可以級聯刪除了; 修改Class.hbm.xml配置如下: <hibernate-mapping package="com.cy.model"><class name="Class" table="t_class"><id name="id" column="classId"><generator class="identity"></generator></id><property name="name" column="className"></property><set name="students" cascade="delete" inverse="true"><key column="classId"></key><one-to-many class="com.cy.model.Student"/></set></class> </hibernate-mapping>console:
注:級聯刪除是一個危險的操作,企業開發一般是不允許的;很可能導致其他業務數據的丟失。。。?
第七節:一對多雙向自身關聯關系映射
?例如使用在菜單上,使用節點來模擬:
?com.cy.model.Node:
package com.cy.model;import java.util.HashSet; import java.util.Set;public class Node {private long id;private String name;private Node parentNode; //它的父節點private Set<Node> childNodes = new HashSet<Node>(); //它的子節點public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Node getParentNode() {return parentNode;}public void setParentNode(Node parentNode) {this.parentNode = parentNode;}public Set<Node> getChildNodes() {return childNodes;}public void setChildNodes(Set<Node> childNodes) {this.childNodes = childNodes;}} View CodeNode.hbm.xml:
<?xml version="1.0"?> <!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.cy.model"><class name="Node" table="t_node"><id name="id" column="nodeId"><generator class="native"></generator></id><property name="name" column="nodeName"></property><many-to-one name="parentNode" column="parentId" class="com.cy.model.Node" cascade="save-update"></many-to-one><set name="childNodes" inverse="true"><key column="parentId"></key><one-to-many class="com.cy.model.Node"/></set></class> </hibernate-mapping>將Node.hbm.xml加入hibernate.cfg.xml中mapping配置;
測試代碼:
package com.cy.service;import org.hibernate.Session; import org.hibernate.SessionFactory; import org.junit.After; import org.junit.Before; import org.junit.Test;import com.cy.model.Node; import com.cy.util.HibernateUtil;public class NodeTest {private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();private Session session;@Beforepublic void setUp() throws Exception {session = sessionFactory.openSession(); session.beginTransaction(); }@Afterpublic void tearDown() throws Exception {session.getTransaction().commit(); session.close(); }@Testpublic void testSaveMenu() {Node node=new Node();node.setName("根節點");Node subNode1=new Node();subNode1.setName("子節點1");Node subNode2=new Node();subNode2.setName("子節點2");subNode1.setParentNode(node);subNode2.setParentNode(node);session.save(subNode1);session.save(subNode2);} } View Code結果:
?
?
轉載于:https://www.cnblogs.com/tenWood/p/7242710.html
總結
以上是生活随笔為你收集整理的Hibernate学习4—关联关系一对多映射2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: request对象中的get、post方
- 下一篇: Android Studio快捷键——编