首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate 多對多關聯映射:資料表設計與 XML 設定完整指南

     編輯:Java 綜合教學

資料表結構

多對多需兩張實體表 + 一張關聯表。關聯表僅含兩個外鍵欄位,組成複合主鍵,不對應實體類別(無 POJO、無映射檔)。

SQL 建表範例(MySQL)

-- 實體表:使用者
CREATE TABLE `user` (
    `userid` VARCHAR(20) PRIMARY KEY,
    `name`   VARCHAR(20) NOT NULL,
    `age`    INT NOT NULL,
    `birthday` DATE NOT NULL
);

-- 實體表:課程
CREATE TABLE `course` (
    `id`          INT PRIMARY KEY AUTO_INCREMENT,
    `title`       VARCHAR(50) NOT NULL,
    `description` TEXT NOT NULL,
    `course_num`  INT NOT NULL
);

-- 關聯表:使用者_課程
CREATE TABLE `user_course` (
    `userid` VARCHAR(20) NOT NULL,
    `cid`    INT NOT NULL,
    PRIMARY KEY (`userid`, `cid`),
    FOREIGN KEY (`userid`) REFERENCES `user`(`userid`) ON DELETE CASCADE,
    FOREIGN KEY (`cid`)    REFERENCES `course`(`id`) ON DELETE CASCADE
);

Hibernate 映射檔

User.hbm.xml

<class name="User" table="user">
    <id name="userid" column="userid">
        <generator class="assigned"/> <!-- 字串主鍵指派 -->
    </id>
    <property name="name" column="name"/>
    <property name="age" column="age"/>
    <property name="birthday" column="birthday"/>

    <set name="courses" table="user_course" lazy="true">
        <key column="userid"/>
        <many-to-many class="Course" column="cid"/>
    </set>
</class>

Course.hbm.xml

<class name="Course" table="course">
    <id name="id" column="id">
        <generator class="identity"/> <!-- 自增 -->
    </id>
    <property name="title" column="title"/>
    <property name="description" column="description"/>
    <property name="courseNum" column="course_num"/>

    <set name="users" table="user_course" inverse="true" lazy="true">
        <key column="cid"/>
        <many-to-many class="User" column="userid"/>
    </set>
</class>

關鍵屬性解析

  • table="user_course":指定關聯表名稱。
  • key column:本方在關聯表的外鍵欄位。
  • many-to-many column:對方在關聯表的外鍵欄位。
  • inverse="true":由另一方維護關聯(雙向關聯必須一方設 true,避免重複 INSERT/DELETE)。
  • lazy="true":預設延遲載入。

雙向操作最佳實踐

// 新增關聯
User u = session.get(User.class, "U001");
Course c = session.get(Course.class, 101);
u.getCourses().add(c);        // 必須在 inverse="false" 方操作
c.getUsers().add(u);          // 同步記憶體端雙向引用
session.saveOrUpdate(u);      // 只需儲存維護方

注意:關聯表無額外欄位(如建立時間、狀態)時才用純多對多;若有額外屬性,應將關聯表提升為實體,改為兩組一對多。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved