关系映射多对多详解
来源:互联网 发布:知乎账号 已注销 编辑:程序博客网 时间:2024/06/11 22:03
关系映射多对多
一. 多对多:学生和老师是一个典型的多对多事例;在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;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();
}
}
}
- Hibernate对象关系映射详解之一对多关系映射
- 关系映射多对多详解
- Hibernate 多对多关系映射详解
- 关系映射一对多,多对一详解
- 多对多映射关系
- 多对多关系映射
- 多对多关系映射
- Mybatis映射关系-多对一映射
- Hibernate关系映射之多对多关系
- Hibernate对象关系映射-- 多对多关联关系映射
- Hibernate映射关系之多对多关系映射
- hibernate映射总结详解: 映射多对一单向关联关系
- mybatis关系映射之一对多和多对一详解
- Hibernate对象关系映射详解之“一对多”关系映射
- Hibernate的关系映射多对多
- 双向多对多关系的映射
- hibernate之映射关系多对多
- hibernate 映射关系 多对多
- 主键约束、唯一性约束、检查约束
- 存储过程中使用事务
- 不同浏览器下<a href="#">与<a href="javascript:void(0);">的区别
- MYSQL 将两列作为一个unique约束
- 在D3D中使用MRT(Multiple Render Targets)
- 关系映射多对多详解
- c#解析excel
- asp.net 发邮件
- http://technet.microsoft.com/en-us/library/gg398063.aspx
- 求集合子集
- 关于uboot,kernel,文件系统存储在开发板nand
- 修改linux内核的启动logo和禁用启动光标(原创)
- DWZ (JUI) 教程 页面定义函数应注意的问题
- 改file样式,上传文件按钮前面没有选择框