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

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

     編輯:Java 相關知識

前言

承接一對一雙向關聯,本文解析多對一單向關聯。多對一是最常見的關聯類型:多個子實體指向同一父實體(如:多個 User 屬於同一 Group)。

領域模型

public class Group { // 一的一方
    private int id;
    private String name;
    // getter/setter
}

public class User { // 多的一方,持有 Group 引用
    private int id;
    private String name;
    private Group group; // 關鍵:單一引用
    // getter/setter
}

對比:多對一 vs 一對一

特徵一對一多對一
指向端基數1多
外鍵唯一性唯一 (unique=true)非唯一
映射標籤<many-to-one unique="true"><many-to-one>
資料庫結構外鍵加 UNIQUE 約束普通外鍵

結論:一對一是多對一的特例(加上唯一約束)。

資料庫結構

表欄位
t_groupid (PK), name
t_userid (PK), name, groupid (FK)

映射配置 (hbm.xml)

<class name="com.zs.hibernate.User" table="t_user">
  <id name="id"><generator class="native"/></id>
  <property name="name"/>
  <many-to-one name="group" column="groupid" cascade="save-update"/>
</class>

<class name="com.zs.hibernate.Group" table="t_group">
  <id name="id"><generator class="native"/></id>
  <property name="name"/>
  <!-- 無導航 -->
</class>

關鍵配置解析

  • name="group":User 類別中的屬性名
  • column="groupid":User 表中外鍵欄位名
  • cascade="save-update":持久化 User 時自動持久化/更新關聯的 Group (若 Group 為 transient)

對比:一對一映射配置

<class name="com.zs.hibernate.Person" table="t_person">
  <id name="id"><generator class="native"/></id>
  <property name="name"/>
  <many-to-one name="idCard" column="idcard_id" unique="true"/> <!-- 唯一約束 -->
</class>

<class name="com.zs.hibernate.IdCard" table="t_idCard">
  <id name="id"><generator class="native"/></id>
  <property name="cardNo"/>
</class>

唯一差異:unique="true"。

註解配置對照

@Entity @Table(name="t_user")
public class User {
    @ManyToOne
    @JoinColumn(name="groupid")
    private Group group;
}

@Entity @Table(name="t_group")
public class Group {
    // 無註解,或 @OneToMany(mappedBy="group") 若需雙向
}

下一步預告

下篇講解一對多單向關聯:反轉導航方向,在 Group 端配置 <set> + <one-to-many>。

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