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