多对多的表映射关系可以相当于是老师和学生,一个老师可以有多个学生,一个学生也可以有多个老师,下面是学生老师表的配置和代码
Student类
package pojo;
import java.util.HashSet;
import java.util.Set;
public class Student {
//sid sname sgender
private Long sid;
private String sname;
private String sgender;
//集合Teacher
private Set<Teacher>teachers=new HashSet<>();
public Long getSid() {
return sid;
}
public void setSid(Long sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSgender() {
return sgender;
}
public void setSgender(String sgender) {
this.sgender = sgender;
}
public Set<Teacher> getTeachers() {
return teachers;
}
public void setTeachers(Set<Teacher> teachers) {
this.teachers = teachers;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", sgender=" + sgender + "]";
}
public Student(Long sid, String sname, String sgender, Set<Teacher> teachers) {
super();
this.sid = sid;
this.sname = sname;
this.sgender = sgender;
this.teachers = teachers;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
}
Teacher类
package pojo;
import java.util.HashSet;
import java.util.Set;
public class Teacher {
//tid tanme tsex
private Long tid;
private String tname;
private String tsex;
//集合Student
private Set<Student> students=new HashSet<>();
@Override
public String toString() {
return "Teacher [tid=" + tid + ", tname=" + tname + ", tsex=" + tsex + ", students=" + students + "]";
}
public Long getTid() {
return tid;
}
public void setTid(Long tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public String getTsex() {
return tsex;
}
public void setTsex(String tsex) {
this.tsex = tsex;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
public Teacher(Long tid, String tname, String tsex, Set<Student> students) {
super();
this.tid = tid;
this.tname = tname;
this.tsex = tsex;
this.students = students;
}
public Teacher() {
super();
// TODO Auto-generated constructor stub
}
}
Student.hbm.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="pojo.Student" table="student">
<id name="sid">
<generator class="native"/>
</id>
<property name="sname"/>
<property name="sgender"/>
<!--set name当前对象的集合的属性 table:中间表的名字-->
<set name="teachers" table="stu_teacher" inverse="false" cascade="save-update,delete">
<!-- 表示当前对象 在中间中的外键 -->
<key column="sid"/>
<!-- 当前对象中的集合的类型Teacher Teacher的全限定名-->
<many-to-many column="tid" class="pojo.Teacher" />
</set>
</class>
</hibernate-mapping>Teacher.hbm.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="pojo.Teacher" table="teacher">
<id name="tid">
<generator class="native"/>
</id>
<property name="tname"/>
<property name="tsex"/>
<!--set name当前对象的集合的属性 table:中间表的名字--> <set name="students" table="stu_teacher" inverse="true" cascade="save-update,delete"> <!-- 表示当前对象 在中间中的外键 -->
<key column="tid"/>
<!-- 当前对象中的集合的类型Student在中间中的外键 和全限定名 Teacher的全限定名-->
<many-to-many column="sid" class="pojo.Student" />
</set>
</class>
</hibernate-mapping>hibernate.cfg.xml只需要引入student和teacher的映射配置文件就好
test类//模拟一对多来实现保存学生和老师
/**
* 多对多 保存数据 默认是双方都要维护外键 多对多必须要有一方来放弃对外键的维护 inverser="true"
* 多对多任意一方放弃对外键的维护 都可以
* 一般情况下:让哪一方来维护外键呢??? 如果我们频繁操作学生,让学生来维护外键,老师就得放弃对外键的维护。
* 现在我存储学生来级联保存老师,学生维护外键,回去中间表里面插入数据;
* 这个时候保存老师来级联保存学生,这个时候,老师放弃对外键维护了,不会往中间表里面插入数据。
*/
@Test
public void run1(){
Session session = HibernateUtil.getCurrentSession();
Transaction ts = session.beginTransaction();
//
Student s1=new Student();
Student s2=new Student();
Teacher t1=new Teacher();
Teacher t2=new Teacher();
s1.setSname("同学1");
s2.setSname("同学2");
t1.setTname("老师1");
t2.setTname("老师2");
//建立关系 同学1对应2个老师
s1.getTeachers().add(t1);
s1.getTeachers().add(t2);
s2.getTeachers().add(t1);//同学2对应一个老师
t1.getStudents().add(s1);
t1.getStudents().add(s2);
t2.getStudents().add(s1);
session.save(t1);
session.save(t2);
session.save(s1);
session.save(s2);
ts.commit();
}
1073

被折叠的 条评论
为什么被折叠?



