Hibernate多對多雙向關聯的配置

来源:http://www.cnblogs.com/bdpsc/archive/2016/08/13/5768574.html
-Advertisement-
Play Games

Hibernate的雙向多對多關聯有兩種配置方法:那我們就來看看兩種方案是如何配置的。 一、創建以各自類為類型的集合來關聯 1.首先我們要在兩個實體類(雇員<Emploee>、工程<Project>)中各自給對方添加一個對方的集合 1.1 雇員實體類 1.2 工程實體類 2.有了實體類之後呢,我們就 ...


         Hibernate的雙向多對多關聯有兩種配置方法:那我們就來看看兩種方案是如何配置的。

         一、創建以各自類為類型的集合來關聯

      1.首先我們要在兩個實體類(雇員<Emploee>、工程<Project>)中各自給對方添加一個對方的集合

       1.1 雇員實體類

package cn.manytomany.one;

import java.util.HashSet;
import java.util.Set;

public class Emploee {
    //雇員id
    private Integer empId;
//工程
private String empName;
//工程的集合
private Set<Project> projects=new HashSet<Project>(); public Set<Project> getProjects() { return projects; } public void setProjects(Set<Project> projects) { this.projects = projects; } public Integer getEmpId() { return empId; } public void setEmpId(Integer empId) { this.empId = empId; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } }

 

       1.2 工程實體類

package cn.manytomany.one;

import java.util.HashSet;
import java.util.Set;

public class Project {
    private Integer proId;
    private String proName;
    private Set<Emploee> emploees=new HashSet<Emploee>();
    
    public Set<Emploee> getEmploees() {
        return emploees;
    }
    public void setEmploees(Set<Emploee> emploees) {
        this.emploees = emploees;
    }
    public Integer getProId() {
        return proId;
    }
    public void setProId(Integer proId) {
        this.proId = proId;
    }
    public String getProName() {
        return proName;
    }
    public void setProName(String proName) {
        this.proName = proName;
    }
    
}

 

 

      2.有了實體類之後呢,我們就能通過實體的屬性和資料庫的表欄位配置映射關係。

      2.1 emploees.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.manytomany.one">
    <class name="Emploee" table="Emploee">
        <id name="empId">
        <generator class="sequence">
        <param name="sequence">SQU_NUM</param>
        </generator>
        </id>
        <property name="empName"></property>
        <set name="projects" table="PROEMP">
         <key column="RPROID"></key>
         <many-to-many class="Project" column="REMPID">
         </many-to-many>
        </set>
    </class>
</hibernate-mapping>

 

 

      2.2   projects.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.manytomany.one">
    <class name="Project" table="PROJECT">
        <id name="proId">
        <generator class="sequence">
        <param name="sequence">SQU_NUM</param>
        </generator>
        </id>
        <property name="proName"></property>
        
        <set name="emploees" table="PROEMP" cascade="save-update">
         <key column="REMPID"></key>
         <many-to-many class="Emploee" column="RPROID">
         </many-to-many>
        </set>
    </class>
</hibernate-mapping>

 

   

     2.3 另外還有一個最重要的大配置來引用兩個小配置

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">
            oracle.jdbc.OracleDriver
        </property>
        <property name="connection.url">
            jdbc:oracle:thin:@localhost:1521:orcl
        </property>
        <property name="connection.username">happy</property>
        <property name="connection.password">1</property>

        <!-- SQL dialect 方言-->
        <property name="dialect">
            org.hibernate.dialect.Oracle10gDialect
        </property>

        <!-- Disable the second-level cache 二級緩存-->
        <!--<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>-->

        <!-- Echo all executed SQL to stdout 是否在控制台顯示sql語句-->
        <property name="show_sql">true</property>

        <!-- 格式化顯示SQL -->
        <property name="format_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

        <!-- 關聯小配置 -->
        <mapping resource="cn/manytomany/doubleanother/emploees.hbm.xml" />
        <mapping resource="cn/manytomany/doubleanother/projects.hbm.xml" />
</session-factory> </hibernate-configuration>

 

 

 

    3.最後就是測試類了

package cn.manytomany.one;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class ManyToManyDoubleTest {

    /**
     * 多對多的雙向關聯測試
     */
    public static void main(String[] args) {
        Session session = HibernateUtil.currentSession();
        Transaction tsc = session.beginTransaction();
        //創建雇員
        Emploee emp=new Emploee();
        emp.setEmpName("田超");
        Emploee emp1=new Emploee();
        emp1.setEmpName("施強");
        
        //創建工程
        Project pro=new Project();
        pro.setProName("開發工程");
        pro.getEmploees().add(emp);
        pro.getEmploees().add(emp1);
         try {
            session.save(pro);
            tsc.commit();
        } catch (Exception e) {
            // 回滾
            tsc.rollback();
        }
        HibernateUtil.closeSession();
    }

}

 

 

     3.1 最後補充一下工具類,看看就行

package cn.manytomany.one;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
/*
 * session工具類
 */
public class HibernateUtil {

    private static final ThreadLocal<Session> sessionTL=new ThreadLocal<Session>();
    private static Configuration cfg;
    private static final SessionFactory sf;
    static{
        try {
            cfg=new Configuration().configure();
            sf = cfg.buildSessionFactory();
        } catch (Exception e) {
            //異常
            e.printStackTrace();
            throw new ExceptionInInitializerError(e);
        }
    }
    public static Session currentSession(){
        Session session=sessionTL.get();
        //如果session為null,則打開一個新的session
        if (session==null) {
            session=sf.openSession();
            sessionTL.set(session);
        }
        return session;
    } 
    public static void closeSession(){
        Session session=sessionTL.get();
        sessionTL.set(null);
        session.close();
        
    }

}

 

 

     

     二、創建一個中間的實體類來關聯

       1.跟第一個方案差不多,先實現三個實體類,代碼如下:

package cn.manytomany.doubleanother;

import java.util.HashSet;
import java.util.Set;

public class Emploee {
    
    private Integer empId;
    private String empName;
    private Set<ProEmp> proemp=new HashSet<ProEmp>(); //集合的類型為中間的實體類類型
    public Set<ProEmp> getProemp() {
        return proemp;
    }
    public void setProemp(Set<ProEmp> proemp) {
        this.proemp = proemp;
    }
    public Integer getEmpId() {
        return empId;
    }
    public void setEmpId(Integer empId) {
        this.empId = empId;
    }
    public String getEmpName() {
        return empName;
    }
    public void setEmpName(String empName) {
        this.empName = empName;
    }
    

}

 

 

package cn.manytomany.doubleanother;

import java.util.HashSet;
import java.util.Set;

public class Project {
    private Integer proId;
    private String proName;
   //集合的類型依然為中間的實體類類型
private Set<ProEmp> proemp=new HashSet<ProEmp>();

    public Set<ProEmp> getProemp() {
     return proemp;
   }
    public void setProemp(Set<ProEmp> proemp) {
     this.proemp = proemp;
   }
   public Integer getProId() {
    return proId;
  }
   public void setProId(Integer proId) {
    this.proId = proId;
  }
   public String getProName() {
    return proName;
  }
   public void setProName(String proName) {
     this.proName = proName;
   }

}



 

 

     1.1  補充的中間實體類

    

package cn.manytomany.doubleanother;

public class ProEmp {
    
    private Integer id;
    private Emploee emp;
    private Project pro;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Emploee getEmp() {
        return emp;
    }
    public void setEmp(Emploee emp) {
        this.emp = emp;
    }
    public Project getPro() {
        return pro;
    }
    public void setPro(Project pro) {
        this.pro = pro;
    }
    
}

 

 

     2. 接下來就是小配置了,跟第一個方案格式幾乎是一樣的,就不過多解釋了,直接來看小配置就行了。

    因為我們要用中間實體類來關聯,所以雇員類(Emploee)和工程類(Project)沒有什麼眼添加的,只需按照正常的配置即可。

    2.1 emploees.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.manytomany.doubleanother">
    <class name="Emploee" table="Emploee">
        <id name="empId">
        <generator class="sequence">
        <param name="sequence">SQU_NUM</param>
        </generator>
        </id>
        <property name="empName"></property>
    </class>
</hibernate-mapping>

 

  

    2.2  emploees.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.manytomany.doubleanother">
    <class name="Project" table="PROJECT">
        <id name="proId">
        <generator class="sequence">
        <param name="sequence">SQU_NUM</param>
        </generator>
        </id>
        <property name="proName"></property>
    </class>
</hibernate-mapping>

 

   

     2.3 關鍵就在於 proemp.hbm.xml   (把多對多關聯轉化成兩個多對一來關聯)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.manytomany.doubleanother">
    <class name="ProEmp" table="PROEMPNEW">
        <id name="id">
        <generator class="sequence">
        <param name="sequence">SQU_NUM</param>
        </generator>
        </id>
        <many-to-one name="emp" class="Emploee" column="EMPID">
        </many-to-one>
        <many-to-one name="pro" class="Project" column="PROID">
        </many-to-one>
    </class>
</hibernate-mapping>

 

 

    3. 現在就可以進行測試類測試數據了

package cn.manytomany.doubleanother;

import org.hibernate.Session;
import org.hibernate.Transaction;

import cn.manytomany.one.HibernateUtil;


public class ManyToManyDoubleOnlyAnother {

    /**
     * 多對多雙向關聯---兩個多對一關聯
     */
    public static void main(String[] args) {
        Session session = HibernateUtil.currentSession();
        Transaction tsc = session.beginTransaction();
        //創建雇員
        Emploee emp=new Emploee();
        emp.setEmpName("田超");
        
        //創建工程
        Project pro=new Project();
        pro.setProName("開發工程");
        
        //中間類
        ProEmp proemp=new ProEmp();
        proemp.setEmp(emp);
        proemp.setPro(pro);
         try {
            //保存
            session.save(emp);
            session.save(pro);
            session.save(proemp);
            tsc.commit();
        } catch (Exception e) {
            // 回滾
            tsc.rollback();
        }
        HibernateUtil.closeSession();

    }

}

 

 

     好了, Hibernate的多對多雙向關聯的兩種方案已經完成,如果覺得對你們有用的話,記得點個關註啊!!!

 


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

-Advertisement-
Play Games
更多相關文章
  • 在離線環境中發佈.NET Core至Windows Server 2008 0x00 寫在開始 之前一篇博客中寫了在離線環境中使用.NET Core,之後一邊學習一邊寫了一些頁面作為測試,現在打算發佈一下試試。看了下官方給出的發佈教程感覺挺詳細的了(https://docs.asp.net/en/l ...
  • QrCodeNet下載地址:http://qrcodenet.codeplex.com/ Controller: View: 效果如下: ...
  • 現階段的項目是採用前後端分離的思想,前端使用的是Angular.JS,後端使用ABP框架,在後端我們通過WebAPI技術來向前端提供json數據。以前是通過MVC來寫前端的代碼,感覺後端有點在控制前端的節奏,一些少量的後端代碼還是需要在HTML頁面中寫的,這次採用的這種模式,前端不需要寫一點後端的C ...
  • 標簽: 依賴註入 Autofac ASPNETCore ASP.NET Core依賴註入解讀&使用Autofac替代實現 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac實現和自定義實現擴展方法 3.1 安裝Autofac 3.2 創建容器並註冊依賴 4. 參考 ...
  • 定義函數 Python中定義函數的格式為: 函數在執行到return語句時結束,並將結果返回。如果沒有return語句,函數執行完畢後返回None。 例: 結果為: my age is 20 ps :str(x)函數我一開始並不知道具體功能是什麼,只是覺得應該要將int型轉換成string類型再輸出 ...
  • ELF文件格式是一個開發標準,各種UNIX系統的可執行文件都採用ELF格式,它有三種不同的類型: 可重定位的目標文件 可執行文件 共用庫 現在分析一下上一篇文章中經過彙編之後生成的目標文件max.o和鏈接之後生成的可執行文件max的格式,從而理解彙編、鏈接和載入執行的過程。 一、目標文件 ELF文件 ...
  • 一、簡單的彙編程式 以下麵這段簡單的彙編代碼為例 (註意是globl不是global;movl(MOVL)不是mov1(MOV一)) 將這段程式保存為demo.s,然後用彙編器as把彙編程式中的助記符翻譯成機器指令(彙編指令與機器指令是對應的)生成目標文件demo.o。然後用鏈接器ld把目標文件de ...
  • 對象,常見數據類型與序列的內部功能,collections模塊 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...