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

Hibernate 從入門到精通(十):多對多單向關聯映射詳解

     編輯:Java 相關知識

前言

繼一對多雙向關聯後,進入多對多映射。本文解析多對多單向關聯,對比一對多單向異同,掌握中間表機制。

領域模型

public class Role { // 被動端,無導航
    private int id;
    private String name;
    // getter/setter
}

public class User { // 主動端,持有 Role 集合
    private int id;
    private String name;
    private Set roles; // 單向導航:User → Role
    // getter/setter
}

對比:多對多單向 vs 一對多單向

特徵一對多單向多對多單向
關聯端基數一 → 多多 → 多
外鍵位置多的一方表加外鍵需第三張中間表
映射標籤<one-to-many><many-to-many>
導航方向單向單向

資料庫結構:中間表是關鍵

表欄位
t_userid (PK), name
t_roleid (PK), name
t_user_roleuser_id (FK), role_id (FK), PK(user_id, role_id)

中間表 t_user_role 解決「多對多無法在單表加外鍵」的難題。

映射配置 (hbm.xml)

<class name="com.zs.hibernate.User" table="t_user">
  <id name="id"><generator class="native"/></id>
  <property name="name"/>
  <set name="roles" table="t_user_role">
    <key column="user_id"/>
    <many-to-many class="com.zs.hibernate.Role" column="role_id"/>
  </set>
</class>

<class name="com.zs.hibernate.Role" table="t_role">
  <id name="id"><generator class="native"/></id>
  <property name="name"/>
  <!-- 無導航,無 set 配置 -->
</class>

關鍵點解析

  1. <set name="roles" table="t_user_role">:指定中間表名
  2. <key column="user_id"/>:中間表中指向 User 的外鍵欄
  3. <many-to-many class="Role" column="role_id"/>:指向 Role 的外鍵欄,標記為多對多
  4. Role 類別完全不知曉 User 存在,純粹被動

單向缺陷與雙向必要性

  • 無法從 Role 導航到 User
  • 若需刪除 Role,必須先手動清理中間表關聯,否則違反外鍵約束
  • 業務若需雙向查詢,必須升級為雙向關聯(下篇講解)

註解配置對照

@Entity @Table(name="t_user")
public class User {
    @ManyToMany
    @JoinTable(name="t_user_role",
        joinColumns=@JoinColumn(name="user_id"),
        inverseJoinColumns=@JoinColumn(name="role_id"))
    private Set roles = new HashSet<>();
}

@Entity @Table(name="t_role")
public class Role {
    // 無註解,純被動
}

下一步預告

下篇將講解多對多雙向關聯映射,實現 Role → User 反向導航,並對比註解 mappedBy 機制。

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