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、在客户端的代码中,通过一的一方建立关系

    3session.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、在客户端通过多的一方建立关联