Hibernate一對多單向(雙向)關聯映射

来源:http://www.cnblogs.com/hgc-bky/archive/2016/12/26/6224067.html
-Advertisement-
Play Games

(1)、編寫配置文件 Hibernate通過讀寫預設的XML配置文件hibernate.cfg.xml載入資料庫配置信息、代碼如下: (2)、編寫持久化類 持久化類是Hibernate操作的對象、它與資料庫中的數據表相對應 (3)、編寫映射文件 (4)、編寫Hibernate的工具類 ...


(1)、編寫配置文件

  Hibernate通過讀寫預設的XML配置文件hibernate.cfg.xml載入資料庫配置信息、代碼如下: 

<hibernate-configuration>
 	<session-factory>
		<!-- 資料庫驅動 -->
		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 資料庫連接的URL -->
		<property name="connection.url">jdbc:mysql://localhost:3306/db_database14</property>
		<!-- 資料庫連接用戶名 -->
		<property name="connection.username">root</property>
		<!-- 資料庫連接密碼 -->
		<property name="connection.password"></property>
		<!-- Hibernate方言 -->
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 列印SQL語句 -->
		<property name="show_sql">true</property>
		<!-- 映射文件  -->
		<mapping resource="com/wgh/model/Book.hbm.xml" />
		<mapping resource="com/wgh/model/Category.hbm.xml" />		
 	</session-factory>
 </hibernate-configuration>

(2)、編寫持久化類

  持久化類是Hibernate操作的對象、它與資料庫中的數據表相對應

(雙向)
/**
* 圖書類別持久化類 */ public class Category { private Integer id; //ID private String name; //類別名稱 private Set<Book> books; //Set集合(類別中的所有圖書) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Book> getBooks() { return books; } public void setBooks(Set<Book> books) { this.books = books; } }
(單向)
/**
* 圖書類別持久化類 */ public class Category { private Integer id; //ID private String name; //類別名稱 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
/**
 * 圖書持久類
 */
public class Book {
    private Integer id;            //ID
    private String name;        //圖書名稱
    private String author;
    private Category category;    //所屬類別
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
}

(3)、編寫映射文件

(雙向)
<hibernate-mapping package="com.wgh.model"> <class name="Category" table="tb_Category_manytoone3"> <id name="id"> <generator class="native"/> </id> <property name="name" not-null="true" length="200" /> <!-- 一對多映射 --> <set name="books"> <key column="categoryId"/> <one-to-many class="Book"/> </set> </class> </hibernate-mapping>
(單向)
<hibernate-mapping package="com.wgh.model"> <class name="Category" table="tb_Category_manytoone0"> <id name="id"> <generator class="native"/> </id> <property name="name" not-null="true" length="200" /> </class> </hibernate-mapping>
<hibernate-mapping package="com.wgh.model">
    <class name="Book" table="tb_book_manytoone0">
        <!-- 主鍵 -->
        <id name="id">
            <generator class="native"/>
        </id>
        <!-- 圖書名稱 -->
        <property name="name" not-null="true" length="200" />
        <!-- 作者 -->
        <property name="author" not-null="true" length="50"/>
        <!-- 多對一關聯映射 -->
        <many-to-one name="category" class="Category">
            <!-- 映射的欄位 -->
            <column name="categoryId"/>
        </many-to-one>
    </class>
</hibernate-mapping>

(4)、編寫Hibernate的工具類

package com.wgh.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static SessionFactory sessionFactory = null; // SessionFactory對象
    // 靜態塊
    static {
        try {
            Configuration cfg = new Configuration().configure(); // 載入Hibernate配置文件
            sessionFactory = cfg
                    .buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties())
                            .buildServiceRegistry());
        } catch (Exception e) {
            System.err.println("創建會話工廠失敗");
            e.printStackTrace();
        }
    }

    /**
     * 獲取Session
     * 
     * @return Session
     * @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        if (session == null || !session.isOpen()) {
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            session = (sessionFactory != null) ? sessionFactory.openSession()
                    : null;
            threadLocal.set(session);
        }
        return session;
    }

    /**
     * 重建會話工廠
     */
    public static void rebuildSessionFactory() {
        try {
            Configuration cfg = new Configuration().configure(); // 載入Hibernate配置文件
            sessionFactory = cfg
                    .buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties())
                            .buildServiceRegistry());
        } catch (Exception e) {
            System.err.println("創建會話工廠失敗");
            e.printStackTrace();
        }
    }

    /**
     * 獲取SessionFactory對象
     * 
     * @return SessionFactory對象
     */
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    /**
     * 關閉Session
     * 
     * @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);
        if (session != null) {
            session.close(); // 關閉Session
        }
    }
}

 

 

 

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今日問題: 請問主程式輸出結果是什麼?(點擊以下“【Java每日一題】20161227”查看20161226問題解析) 題目原發佈於公眾號、簡書:【Java每日一題】20161227,【Java每日一題】20161227 註:weknow團隊近期開通並認證了分答,歡迎大家收聽,有問題也歡迎到分答來咨 ...
  • 第1個導航 1 2 3 4 第2個導航 1 2 3 第3個導航 1 2 第4個導航 ... ...
  • 一、包的概念:創建,使用。 1.新建包: 最上面一行,之前不能再有其它代碼了。 package 包名; 註意:包名一般都有命名的規範。例如:com.itnba.maya.zy(從大到小)。 2.使用包: import 包名.*; import 包名.類名; 例如:import com.itnba.m ...
  • 這個類在日常的開發中,還是非常常用的。今天就總結一下Arrays工具類的常用方法。最常用的就是asList,sort,toStream,equals,copyOf了。另外可以深入學習下Arrays的排序演算法,這個還是非常有用的。 所有的方法都是在下麵的類中進行測試的: asList 這個方法可以把數 ...
  • 目的: 使用垃圾回收器的唯一原因就是:回收程式不再使用的記憶體。 針對的目標對象: Java的垃圾回收器會自動回收不再使用的Java對象,釋放記憶體。但是回收的是用new創建的,分配在堆上的記憶體。 finalize(): 那麼,如果不是用這種方式創建的對象,該怎麼回收?比如:Java調用了本地的c語言方 ...
  • 今天在看別人代碼時看到這樣一種寫法, 感覺是個挺容易踩到的坑, 搞清楚後寫出來備忘. 短路邏輯 Python中進行邏輯運算的時候, 預設採用的是一種叫做短路邏輯的運算規則. 名字是很形象的, 下麵直接看代碼 可以看到, 雖然1會被當做布爾值計算, 但整個表達式的計算結果卻不一定是布爾值, 而是根據表 ...
  • 現在的資料庫越來越多,如mgdb,我比較常用的是mysql,但有一天做項目需要連接SqlServer,就去找了個方法。找了很多無非就mssql模塊和node-sqlserver模塊,但node-sqlserver好像有很多限制和還要編譯,感覺很麻煩,就用了mssql模塊。mssql模塊還是很簡單的, ...
  • 一般的智能指針都是通過一個普通指針來初始化,所以很容易寫出以下的代碼: #include using namespace std; int func1(){ //返回一個整數的函數 } void func2(AutoPtr ptr,int t){ //一些操作 } int ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...