多対一恐怕是現實世界中存在的最普遍的一種關聯關系了。
hibernate在解決多対一關聯映射時提出了一種普遍的思想:在實體模型中通過“多”持有“一”的引用來反映這種關系,在關系模型中通過在“多”的一端增加個外加指向“一”的一端。其實,這種思想還常常用來解決一對一和多對多。
看看我們的User和Group的執行個體是怎麼實作的吧:
1.實體模型:
2.關系模型:
3.實體類:
Group.java
public class Group {
private int id;
private String name;
//一系列的setter.getter方法
@Override
public String toString() {
return "Group:"+name;
}
}
User.java
public class User {
private Group group;
return "User:"+name;
4.映射檔案:
Group.hbm.xml
<class name="com.sxt.hibernate.many2one.entity.Group" table="sxt_hibernate_group">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
</class>
User.hbm.xml
<class name="com.sxt.hibernate.many2one.entity.User" table="sxt_hibernate_user">
<!--many-to-one含義,會在多的一端加入一個外鍵指向一的一端,以供加載時使用.外鍵由column屬性指定,預設和實體屬性名相同.
cascade操作本對象時級聯操作它的關聯對象 -->
<many-to-one name="group" column="group_id" cascade="save-update"></many-to-one>
5.hibernate配置檔案:
參照前面的。
6.測試方法:
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 測試插入資料
*/
/* Group group = new Group();//情況1.生成一個新的組 g.setName("開發組");
group.setName("研發組");
User user1=new User();
user1.setName("奇隆");
user1.setGroup(group);
User user2=new User();
user2.setName("有朋");
user2.setGroup(group);
//這裡也要保證在save(user)前,它所關聯的group要先save或者在User的映射檔案中配置上cascade級聯save,.
session.save(user1);
session.save(user2);*/
/* Group group=(Group)session.get(Group.class, 2);//情況2.加載資料庫中已經存在的組
User user=new User();
user.setName("謝霆鋒");
user.setGroup(group);
//由于加載的group 已經是持久化的了,是以這樣也能儲存成功.
session.save(user);*/
/**
* 小結:儲存user之前要保證它所引用對象已經是持久化的,這樣在儲存user時,hibernate會自動把user的外鍵指向group的id
*/
User user = (User) session.get(User.class, 3);// 隻是加載了user對象和它所在組的對象group的id屬性,并沒有加載group對象
System.out.println(user);
System.out.println(user.getGroup());
* 小結:可見,在"多"的一端(user)可以加載"一"的一端(group).當然,這裡存在延遲加載政策,有時間專門讨論.
session.save(user);//由于user已經是持久化的對象,并且沒有做出修改,是以這裡并不觸發任何的sql操作
user.setName("鄭伊健");
session.save(user);//由于user已經做了改動,是以這裡會觸發update操作.
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/274832,如需轉載請自行聯系原作者