hibernate一對多雙向關聯

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、在客戶端通過多的一方建立關聯


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章