一、 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, 必然發生賴加載異常!