Hibernate5雙向多對一映射

 

 

 一、 POJO 類 及 xxx.hbm.xml 配置文件

public class Student {
	private int id;
	private String sname;
	
	private Teacher teacher; //老師對象屬性

    ....
}

public class Teacher {
	private Integer id;
	private String tname;
	
	//學生對象集合屬性
	private Set<Student> student = new HashSet<Student>();
    ...
}

從老師的角度:雙向n(學生)many-to-one , 和單向沒變化。映射用個 package 屬性,方便管理包名

<hibernate-mapping package="cn.jq.hibernate5.model">
    <class name="Student" table="T_STUDENT">
        <id name="id" type="int">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="sname" type="java.lang.String">
            <column name="s_name" />
        </property>
        
      
        <many-to-one name="teacher" class="Teacher">
            <column name="teacher_id" />
        </many-to-one>
    </class>
</hibernate-mapping>

從老師的角度:雙向1(老師) one-to-many 映射 ,映射用個 package 屬性,方便管理包名

<hibernate-mapping package="cn.jq.hibernate5.model">
    <class name="Teacher" table="T_TEACHER">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="tname" type="java.lang.String">
            <column name="t_name" />
        </property>
        
        <!-- 
        	name: 爲Teacher(1)類 這端的屬性名
        	table: 爲 Teacher(1)類 這端屬性 所在的表名
        	key(column):  與Student(多)表外鍵名一致
        	calss: 爲Student(多)類 這端的 全限定類名(此處使用了package屬性)
         -->
        <set name="student" table="T_STUDENT"  inverse="true" order-by="id desc">
        	<key>
        		<column name="teacher_id"></column>
        	</key>
        	<one-to-many class="Student"/>
        </set>
    </class>
</hibernate-mapping>

inverse=“true”: 它的作用是指定雙向多對一的映射中, 由那一邊來維護關係。
            inverse="false" (默認值是)主動維護
            inverse="true" 放棄維護
            無     兩端都維護
            在雙向1對n中,推薦 inverse="true",將 1 端放棄維護, 讓 n 端主動維護。
            
cascade="delete", 表示執行級聯刪除, 開發時不建議設置,建議根據需求手工方式來處理
        
order-by="類屬性名 asc/desc ": 設置查詢出來的數據的排序   

	@Test
	public void test() {
		Teacher teacher = session.get(Teacher.class, 1);
		Set<Student> student = teacher.getStudent();
		for (Student stu : student) {
			System.out.println(stu);
		}
		
	}

----降序----
Student [id=2, sname=學生2, teacher=Teacher [id=1, tname=老師1]]
Student [id=1, sname=學生1, teacher=Teacher [id=1, tname=老師1]]

圖簡單明瞭

    

 

二、 junit 測試

建表 sql :   和單向一樣

1、 新增推薦先插入一(1)的這端, 效率高!

	@Test
	public void test() {
		Teacher teacher = new Teacher("老師1");
		
		Student student1 = new Student(); 
		student1.setSname("學生1");
		Student student2 = new Student(); 
		student2.setSname("學生2");
		
		//建立雙向多對一關聯關係  
		student1.setTeacher(teacher);
		student2.setTeacher(teacher);
		
		teacher.getStudent().add(student1);
		teacher.getStudent().add(student2);
		
		session.save(teacher);
		session.save(student1);
		session.save(student2);
	}

 

2. 刪除:

結論: 刪除 Student (多) 這端數據,可正常刪除,Teacher(1) 這端數據 沒影響 。 

           不使用 cascade="delete"時, 刪除 Teacher (1) 這端數據, 會出錯, 因爲受到 外鍵約束。

3. 修改: 正常操作, 沒問題

4. 查詢:

   結論: 默認情況下, 查詢多(n)這端對象, 只要沒使用到關聯的對象, 不會發起關聯的對象的查詢!

           因爲使用的懶加載, 所以在使用關聯對象之前關閉session, 必然發生賴加載異常!  

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章