什麼是映射?
小編這裏總結一年Hibernate的關聯映射,這篇博文主要講多對一的關聯映射。
首先要知道什麼是映射?簡單的說,一個蘿蔔一個坑就是一種映射關係。數學上來說,y = ax^2 + bx + c,就
是x到y 的映射。
Hibernate的基本映射?
而hibernate的基本映射是指:一個類(class)對應一個實體。在映射文件中,實體的標識字段用<id>,
generator指主鍵的生成策略,常用的有:native、uuid、assigned、identity、sequence、foreign;普通屬性字段用
<property>,如下:
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
除此之外我們還需要掌握實體類的設計原則:
1、實現無參的默認構造函數
2、提供一個標識(一般爲id)
3、不要使用final修飾實體類
4、爲實體類生成getter和setter方法
下邊進入正題了~
對象關聯映射?
關聯映射是指將關聯關係映射到數據庫中,在對象模型中就是一個或多個引用。對象的關聯映射分爲:多對
一(一對多)、一對一、多對多。今天我們主要講多對一的情況。
多對一關聯映射
多對一映射原則:在多的一端加入一個外鍵,指向一的一端,如圖:
一個組裏有多個用戶,所以在用戶表裏加入一個外鍵groupid。
新建Group實體類:
package com.bjpowernode.hibernate;
/**
* 建立Group實體類
* @author why_768
*
*/
public class Group {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
新建User實體類:
package com.bjpowernode.hibernate;
/**
* 建立User實體類
* @author why_768
*
*/
public class User {
private int id;
private String name;
private Group group;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
接下來新建實體類對應的映射文件,Group.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="group" column="groupid" cascade="save-update"/>
</class>
</hibernate-mapping>
看到User.hbm.xml文件裏的<many-to-one>就是多對一的標識,column指對group進行重命名,這個groupid
會在數據庫中有對應的字段,cascade(級聯)是對多一關係中的重要屬性,它是對象之間的連鎖操作,隻影響添
加、刪除和修改,對查詢時沒有影響的。cascade主要屬性有:
1、all:在所有的情況下都執行級聯操作,這裏的所有指:增、刪、改三種情況下。
2、none:在所有情況下都不執行級聯操作。
3、save-update:保存和更新時執行級聯操作。
4、delete:僅在刪除操作時執行級聯操作。
下邊用Junit寫測試類:
public void testSave1(){
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Group group = new Group();
group.setName("動力節點");
User user1=new User();
user1.setName("張三");
user1.setGroup(group);
User user2=new User();
user2.setName("李四");
user2.setGroup(group);
session.save(user1);
session.save(user2);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally{
HibernateUtils.closeSession(session);
}
}
控制檯輸出如下語句:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into User (name, groupid) values (?, ?)
Hibernate: insert into User (name, groupid) values (?, ?)
查數據庫,數據已經保存到數據庫了:
多對一的關係相對來說還是比較簡單的,下一篇博客說下多對一的反例:一對多關聯關係的實現。