映射文件中配製關聯關係——多對多

package manyTomany;

import java.util.HashSet;
import java.util.Set;

public class Student {
	private Long id;
	private String name;
	private Set<Teacher> teachers=new HashSet<Teacher>();
	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<Teacher> getTeachers() {
		return teachers;
	}
	public void setTeachers(Set<Teacher> teachers) {
		this.teachers = teachers;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "[Student:id="+id+" name="+name+"]";
	}
}

package manyTomany;

import java.util.HashSet;
import java.util.Set;

public class Teacher {
	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;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "[Teacher:id="+id+" name="+name+"]";
	}
	
}

Student.hbm.xml

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- 

  This mapping demonstrates 

     (1) a table-per-subclass mapping strategy
         
     (2) a simple component mapping
     
     (3) recursive associations withing an inheritance tree
     
-->

<hibernate-mapping 	package="manyTomany">
	<!--
		name:類名
		table:表名
	-->
	<class name="Student" table="t_student">
		
		<id name="id" >
			<generator class="native"/> <!--表示自動增長-->
		</id>
	
        <property name="name" type="string" column="name" />
		
		<!--Teacher屬性,表達的是本類與Teacher的多對多的關係
		table:中間表(集合表)
		key:外鍵,引用當前表主鍵的外鍵
		-->
		<set name="teachers" table="t_teacher_student" inverse="true">
			<key column="studentId"></key>
			<many-to-many class="Teacher" column="teacherId"></many-to-many>
		</set>
	</class>
	

</hibernate-mapping>
Teacher.hbm.xml

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!-- 

  This mapping demonstrates 

     (1) a table-per-subclass mapping strategy
         
     (2) a simple component mapping
     
     (3) recursive associations withing an inheritance tree
     
-->

<hibernate-mapping 	package="manyTomany">
	<!--
		name:類名
		table:表名
	-->
	<class name="Teacher" table="t_teacher">
		
		<id name="id" >
			<generator class="native"/> <!--表示自動增長-->
		</id>
	
        <property name="name" type="string" column="name" />
		
		<!--Student屬性,表達的是本類與Student的多對多的關係-->
		<set name="students" table="t_teacher_student">
			<key column="teacherId"></key>
			<many-to-many class="Student" column="studentId"></many-to-many>
		</set>
	</class>
	

</hibernate-mapping>

package manyTomany;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App {
	private static SessionFactory sessionFactory=new Configuration()
										.configure()
										.addClass(Student.class)
										.addClass(Teacher.class)
										.buildSessionFactory();
	
	@Test
	public void testsave(){
		Session session=sessionFactory.openSession();
		Transaction tx=session.beginTransaction();
		
		//新建對象
		Student student1=new Student();
		student1.setName("王同學");
		Student student2=new Student();
		student2.setName("李同學");
		
		Teacher teacher1=new Teacher();
		teacher1.setName("趙老師");
		Teacher teacher2=new Teacher();
		teacher2.setName("張老師");
		
		//關聯
		student1.getTeachers().add(teacher1);
		student1.getTeachers().add(teacher2);
		student2.getTeachers().add(teacher1);
		student2.getTeachers().add(teacher2);
		
		teacher1.getStudents().add(student1);
		teacher1.getStudents().add(student2);
		teacher2.getStudents().add(student1);
		teacher2.getStudents().add(student2);
		//保存
		session.save(student1);
		session.save(student2);
		session.save(teacher1);
		session.save(teacher2);
		
		tx.commit();
		session.close();
	}
	
	@Test
	public void testget(){
		Session session=sessionFactory.openSession();
		Transaction tx=session.beginTransaction();
		
		
		Teacher teacher=(Teacher) session.get(Teacher.class, 3L);
		System.out.println(teacher);
		System.out.println(teacher.getStudents());
		
		tx.commit();
		session.close();
	}
	
	@Test
	public void testdelete(){
		Session session=sessionFactory.openSession();
		Transaction tx=session.beginTransaction();
		//如果要解除關聯關係,就設置inverse=true
		//如果inverse=false,表示可以維護關聯關係,所以會先刪除中間表的關聯關係,再刪除自己
		//如果inverse=true,表示不維護關聯關係,所以會直接執行刪除自己,就會有異常
		Teacher teacher=(Teacher) session.get(Teacher.class, 3L);
		session.delete(teacher);
		
		tx.commit();
		session.close();
	}
	
}

當設置Student.hbm.xml中的inverse爲false,即Student維護關聯關係,將Teacher.hbm.xml中的inverse設置爲true,即Teacher不維護關聯關係,因爲中間表保存了Student及Teacher的關聯關係,所以在執行刪除Teacher對象時,會拋出異常,此時在Teacher.hbm.xml中設置cascade="delete",就可以在刪除Teacher對象時,同時刪除關聯的其他類的對象。cascade默認爲none,代表不級聯,還可設置爲all,save-update,delete等。

cascade設置爲save-update,表示保存本類對象時,同時會保存關聯的對象,在Student.hbm.xml設置inverse=true,Teacher.hbm.xml中設置cascade="save-update",會將關聯的Student對象進行保存

// session.save(student1);
// session.save(student2);
session.save(teacher1);
session.save(teacher2);

一般一對一、一對多使用級聯,多對多和多對一部使用。

發佈了238 篇原創文章 · 獲贊 20 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章