您的位置:首页 > 其它

hibernate一对多双向关联

2016-07-06 19:43 169 查看

14.一对多双向关联

1.在多的一方关联一的一方,多的一方直接维护了关系,所以多的一方没有inverse属性,多的一方在保存自己的时候直接保存了外键,效率高。2.建立关系和保存对象,可以对应两个映射文件,保存多的一方自己对应自己的映射文件,建立关系可以使用一的一方表的inverse属性。这样发出update语句,效率低了。一对多,从多的一方建立关系,效率高。 例子在student这边保存属性private Classess classess;在student.hbm.xml文件在<class>下添加 <many-to-one name="classess" class="cn.itcast.domain.Classess" column="cid" cascade="save-update"></many-to-one>
public class Mant2OneTest extends HibernateUtils{
@Test
public void testSaveStudent_Cascade_Classess_Save(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("班秘");
student.setDescription("很神秘的一个工作");
Classess Classess = new Classess();
Classess.setCname("老毕亲子班");
Classess.setDescription("都是老毕的亲戚");
student.setClassess(Classess);
session.save(student);
transaction.commit();
session.close();
}
/**
* 一对多,从多的一端维护关系效率比较高
*/
@Test
public void testSaveStudent_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student = new Student();
student.setSname("潘金莲");
student.setDescription("很好");
Classess Classess = (Classess)session.get(Classess.class, 2L);
//student.setClassess(Classess);
Set<Student> students = new HashSet<Student>();
students.add(student);
Classess.getStudents().add(student);//在hibernate内部查看的是Classess.hbm.xml
session.save(student);//在hibernate内部查看的是Student.hbm.xml
transaction.commit();
session.close();
}
@Test
public void testRelese_R(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classess Classess = (Classess)session.get(Classess.class, 2L);
Student student7 = (Student)session.get(Student.class, 7L);
Student student8 = (Student)session.get(Student.class, 8L);
student7.setClassess(null);
student8.setClassess(null);
transaction.commit();
session.close();
}
@Test
public void testDeleteS(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Classess Classess = (Classess)session.get(Classess.class, 1L);
Set<Student> students = Classess.getStudents();
//Classess.setStudents(null);//解除关系
for(Student student:students){
session.delete(student);
}
transaction.commit();
session.close();
}
}

15.一对多总结

1、如果让一的一方维护关系,取决于的因素有
1、在一的一方的映射文件中,set元素的inverse属性为default/false
2、在客户端的代码中,通过一的一方建立关系
3、session.save/update方法是用来操作表的,和操作关系没有关系
2、怎么样采用级联的方法通过保存一个对象从而保存关联对象
1、如果session.save操作的对象是A,这个时候应该看A.hbm.xml,看set元素中cascade是否设置有级联保存
2、在客户端通过A建立关联
3、在客户端执行session.save(A)
3、一对多的情况,多的一方维护关系效率比较高
1、在多的一方many-to-one中没有inverse属性
2、在客户端通过多的一方建立关联
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate