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);
一般一对一、一对多使用级联,多对多和多对一部使用。