Java-Hibernate 一對多關係映射

Hibernate 一對多關係映射


轉載自:https://www.shiyanlou.com/courses/document/994


一、實驗環境說明

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 一對多的關係映射。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章