在上1篇文章(《千山萬水之Hibernate(3)――基本映照 》)中,我們介紹了怎樣通過Hibernate進行最基本的單實體映照和Hibernate設計的1些基本原理,本篇文章將介紹關聯映照中的多對1映照是如何實現的。
我們拿學生和班級為示例,學生屬于某1個班級,而且多個學生是有可能屬于同1個班級的,相應的實體關系圖為:
Class的映照文件向上1篇我們介紹到的基本映照文件那樣編寫即可以,而對Student實體,我們需要從Student中得出對應班級,而Student與Class正是多對1的體現,因此需要在Student中加入many-to-one標簽,以表達出這類關聯關系:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd">
<hibernate-mapping>
<class name="com.tgb.hibernate.Student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" />
<many-to-one name="classes" column="classId"></many-to-one>
</class>
</hibernate-mapping>
為了示例方便,首先我們編寫1個簡單的Hibernate操作工具類,封裝SessionFactory創建、Session的打開與關閉:
public class HibernateTool {
private static SessionFactory factory;
static{
try{
Configuration cfg = new Configuration().configure();
factory=cfg.buildSessionFactory();
}catch(Exception e){
e.printStackTrace();
}
}
public static Session getSession(){
return factory.openSession();
}
public static void closeSession(Session session){
if(session != null){
if(session.isOpen()){
session.close();
}
}
}
public static SessionFactory getSessionFactory(){
return factory;
}
}
1.調用session的Load方法,得出Student對象的級聯班級對象Classes(這也是Hibernate為我們提供的1大好處):
public void testLoad(){
Session session = null;
try{
session = HibernateTool.getSession();
session.beginTransaction();
Student student = (Student)session.load(Student.class, 2);
System.out.println("student.name=" + student.getName());
System.out.println("student.class.name=" + user.getClasses().getName());
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateTool.closeSession(session);
}
}
2.當保存數據時,我們已知道關聯有Transient對象的Persistent狀態的對象不能直接保存至數據庫,由于在清算緩存時,不能得到關聯對象的標識符,因此,我們有兩種解決方案,在將Student對象進行保存前,先將關聯的Classes對象保存,使其保持在Persistent狀態,則Student保存成功,另外1種便是設置級聯保存:
這樣在保存Student對象時,也會將級聯的班級對象進行保存:
public void testSave(){
Session session = null;
try{
session = HibernateTool.getSession();
session.beginTransaction();
Class classes = new Class();
classes.setName("LFSFXY-TGB");
Student student = new Student();
student.setName("張3");
student.setClasses(classes);
session.save(student);
System.out.println("student.name=" + student.getName());
System.out.println("student.classes.name=" + student.getClasses().getName());
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateTool.closeSession(session);
}
}
通過上面的介紹相信你1定知道了Hibernate中的多對1究竟是怎樣1回事,通過示例我們也體會到了對象關聯給我們帶來的好處:級聯查詢出實體,舍棄了我們之前繁瑣的SQL語句操作。也通過級聯屬性cascade簡單了解了級聯保存的操作。
只有通過不斷的練習實踐、總結才能1步步到達熟練利用的程度,繼續加油!