Hibernate 一對多關係映射
一、實驗環境說明
1. 環境登錄
無需密碼自動登錄,系統用戶名 shiyanlou,密碼 shiyanlou
2. 環境介紹
本實驗環境採用帶桌面的 Ubuntu Linux 環境,實驗中可能會用到桌面上的程序:
- XfceTerminal: Linux 命令行終端,打開後會進入 Bash 環境,可以使用 Linux 命令;
- Firefox:瀏覽器,可以用在需要前端界面的課程裏,只需要打開環境裏寫的 HTML/JS 頁面即可;
- GVim:非常好用的編輯器,最簡單的用法可以參考課程 Vim編輯器。
- Eclipse:Eclipse 是著名的跨平臺的自由集成開發環境(IDE)。主要用來 Java 語言開發,但是目前亦有人通過插件使其作爲 C++ 和 Python 等語言的開發工具。
3. 環境使用
使用 GVim 編輯器輸入實驗所需的代碼,然後使用 XfceTerminal 命令行環境進行編譯運行,查看運行結果,運行後可以截圖並分享自己的實驗成果,實驗樓提供的截圖是後臺截圖,無法作弊,可以真實有效證明您已經完成了實驗。
實驗記錄頁面可以在“我的課程”中查看,其中含有每次實驗的截圖及筆記,以及每次實驗的有效學習時間(指的是在實驗桌面內操作的時間,如果沒有操作,系統會記錄爲發呆時間)。這些都是您學習的真實性證明。
二、新建項目工程
我們使用的例子和之前的都是類似的,或者基於以前的例子改變、增加一些其他東西。因此,你應該比較熟悉。本次講解 Hibernate 一對多的關係映射,場景假設爲:一個羣組對應多個用戶。
- 說明:Hibernate 以及其他必要文件已經內置在了實驗環境中。
(1)導入必要的 JAR 包
新建一個 Java 工程,然後引入必要的 jar 包,右擊項目工程,依次選擇 Properties->Java Build Path->Libraries->Add External JARs。Hibernate jar 包路徑爲:/home/shiyanlou/hibernate-release-4.3.9.Final/lib/required/
;mysql-connector jar 包的路徑僞: /home/shiyanlou/mysql-connector-java-5.1.35-bin.jar
。最後總的需要的包如下:
(2)新建相關實體類
這個沒什麼太多說的,一個用戶具有:id(主鍵),以及 username、password 兩個屬性。
package shiyanlou.test.hibernate.entity;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
羣組 Group.java,包含 id(主鍵),groupname 羣組名屬性,以及對應多個 User。
package shiyanlou.hibernate.onetomany.entity;
import java.util.Set;
public class Group {
private int id;
private String groupname;
private Set<User> users;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getGroupname() {
return groupname;
}
public void setGroupname(String groupname) {
this.groupname = groupname;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
(3)配置 hibernate.cfg.xml
在 src 目錄下,新建 hibernate.cfg.xml 文件,其配置如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
'-//Hibernate/Hibernate Configuration DTD 3.0//EN'
'http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd'>
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<!-- 表示使用 mysql 數據庫驅動類 -->
<property name='connection.driver_class'>com.mysql.jdbc.Driver</property>
<!-- jdbc 的連接 url 和數據庫(使用我們之前新建的 hibernate)-->
<property name='connection.url'>jdbc:mysql://localhost:3306/hibernate</property>
<!-- 數據庫用戶名 -->
<property name='connection.username'>root</property>
<!-- 密碼(這裏爲空) -->
<property name='connection.password'></property>
<!-- 數據庫使用的方言 -->
<property name='dialect'>org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL to stdout -->
<!-- 設置 控制檯輸出 sql 語句 爲真 -->
<property name='show_sql'>true</property>
<!-- 設置格式爲 sql -->
<property name='format_sql'>true</property>
<!-- 第一次加載 hibernate 時根據實體類自動建立表結構,以後自動更新表結構 -->
<property name='hbm2ddl.auto'>update</property>
<!-- 映射文件 -->
<mapping resource='shiyanlou/hibernate/onetomany/entity/User.hbm.xml'/>
<mapping resource='shiyanlou/hibernate/onetomany/entity/Group.hbm.xml'/>
</session-factory>
</hibernate-configuration>
(4)配置 User.hbm.xml
一個實體類對應一個映射文件,且位於同一個包(package)下。
首先是 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'>
<!-- 映射對應的 package -->
<hibernate-mapping package='shiyanlou.hibernate.onetomany.entity'>
<!-- class 和數據庫中 table 對應(如果沒有這個表則新建) -->
<class name='User' table='user_table'>
<!-- id 主鍵,設爲自增 -->
<id name='id' column='user_id'>
<generator class='native'></generator>
</id>
<property name='username' column='user_username'></property>
<property name='password' column='user_password'></property>
</class>
</hibernate-mapping>
接下來,我們來看看 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 package='shiyanlou.hibernate.onetomany.entity'>
<class name='Group' table='group_table'>
<id name='id' column='group_id'>
<generator class='native'></generator>
</id>
<property name='groupname' column='group_name'></property>
<!-- 重點關注這裏 -->
<!-- Set 爲我們在 Group.java 中定義的集合 -->
<set name='users' >
<!-- 外鍵名稱 -->
<key column='group_id' ></key>
<!-- 一對多關係對應的 class -->
<one-to-many class='shiyanlou.hibernate.onetomany.entity.User' />
</set>
</class>
</hibernate-mapping>
三、編寫測試類
package shiyanlou.hibernate.onetomany.test;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import shiyanlou.hibernate.onetomany.entity.Group;
import shiyanlou.hibernate.onetomany.entity.User;
public class UserTest {
public static void main(String[] args) {
Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
session.beginTransaction();
// 新建一個 LOL 羣組
Group group = new Group();
group.setGroupname('LOL_Group');
// 新建兩個用戶
Set<User> users = new HashSet<User>();
User user1 = new User();
user1.setUsername('Levis');
user1.setPassword('111');
User user2 = new User();
user2.setUsername('Lee');
user2.setPassword('222');
users.add(user1);
users.add(user2);
// LOL 羣組包含對應這兩個用戶
group.setUsers(users);
// 保存相關對象
for (User user : users) {
session.save(user);
}
session.save(group);
session.getTransaction().commit();
session.close();
sf.close();
}
}
四、運行結果示例
Eclipse 控制檯輸出:
我們可以切換到 mysql 下,查看兩張 table:
五、小結
本次課程我們學習了 Hibernate 一對多的關係映射。