关系映射多对多
一. 多对多:学生和老师是一个典型的多对多事例;在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
二.现对表进行一下简单的分析
三.单向:
在维持关系一端的映射文件中加入:
<hibernate-mapping
package="com.hbsi.domain">
<class name="Student" table="student">
<id name="id"column="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="teachers"table="teacher_student"> <!-- table是用来指定中间表的属性 -->
<key column="student_id"></key> <!-- 查找学生id时,链接中间表表的student_id -->
<many-to-many class="Teacher"column="teacher_id"/>
</set>
</class>
</hibernate-mapping>
双向:
在两边都要加入相对的配置信息:
四.测试
package com.hbsi.test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hbsi.domain.Deparment;
import com.hbsi.domain.Employee;
import com.hbsi.domain.Student;
import com.hbsi.domain.Teacher;
import com.hbsi.hibernate.utils.HibernateUtil;
public class Many2Many {
public static void main(String[] args) {
add();
query(1);
}
public static void add(){
Session s=null;
Transaction tx=null;
try{
s= HibernateUtil.getSession();
tx=s.beginTransaction();
//增加
Teacher t1=new Teacher();
t1.setName("T1");
Teacher t2=new Teacher();
t2.setName("T2");
Student s1=new Student();
s1.setName("s1");
Student s2=new Student();
s2.setName("s2");
Set<Student> ss=new HashSet<Student>();
ss.add(s1);
ss.add(s2);
//如果注释了下面两句话,不会错但是没有了关联
t1.setStudents(ss);
t2.setStudents(ss);
//语句报错主键不能重复,写一方就行了
// Set<Teacher> ts=new HashSet<Teacher>();
// ts.add(t1);
// ts.add(t2);
//
// s1.setTeachets(ts);
// s1.setTeachets(ts);
s.save(t1);
s.save(t2);
s.save(s1);
s.save(s2);
tx.commit();
}finally{
if(s!=null)
s.close();
}
}
public static void query(int teacherId){
Session s=null;
Transaction tx=null;
try{
s= HibernateUtil.getSession();
tx=s.beginTransaction();
Teacher t=(Teacher) s.get(Teacher.class,teacherId);
System.out.println(t.getName());
System.out.println(" 教授教授的学生 ");
Iterator<Student> it=t.getStudents().iterator();
while(it.hasNext()){
Student stu= it.next();
System.out.println(stu.getName());
Student ts= (Student) s.get(Student.class,teacherId);
System.out.println(ts.getName());
System.out.println("学生被那个老师教了 ");
Iterator<Teacher> its=ts.getTeachers().iterator();
while(its.hasNext()){
Teacher teach= its.next();
System.out.println(teach.getName());
}
}
}finally{
if(s!=null)
s.close();
}
}
}