标签:
总结Hibernate的多对多关联的4个特点:
以学生和课程多对多的例子说明,实体类部分代码:
public class Course {
private Integer cid;
private String cname;
private Set<Student> stuSet;
//getter setter......
}
public class Student {
private Integer id;
private String name;
private Date birthday;
private Set<Course> courseSet;
//getter setter......
}
1. 两个实体类,三个表,第三个表不需要实体类。
2. 查询的时候,不需要查询中间表,通过查询另外两个实体类中的一个,调用getter方法,都可以得到中间表的数据
Student stu = service.findById(studentVo.getId());
Set set = stu.getCourseSet();
3. 保存和修改、删除的时候,也不需要操作中间表,操作两个实体类中的一个,就可以向中间表保存或修改或删除数据。
因为有inverse属性,默认为false。
public void save(Student stu,String[] cids) {
session = HibernateUtil.getSession();
tx = session.beginTransaction();
Set set = new HashSet();
for(String cid:cids){
Course course = new Course();
course.setCid(Integer.parseInt(cid));
set.add(course);
}
stu.setCourseSets(set);
session.saveOrUpdate(stu);
//其他事务代码
}
4. 有一个表只有两个字段,构成联合主键,分别指向另两个表的主键,它没有自己的独立的自动递增主键。(映射文件里的set标签或bag标签里面的子元素的两个column是第三个表的两个字段)。
上面第4个特点,是判断是否多对多关系的重要标准。
另外,多对多的模型,可以通过两个多对一实现,所以多对多的概念,一定要分清。例如用户和角色是多对多,但是实现方式可以是两个多对一,也可以是多对多。区分的办法就是通过表的字段。
如果用多对多实现,那么映射文件里set或者bag元素后面配一个table="中间表"。
标签:
原文地址:http://www.cnblogs.com/bobsong/p/5429085.html