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);
一般一對一、一對多使用級聯,多對多和多對一部使用。