承接一對一雙向關聯,本文解析多對一單向關聯。多對一是最常見的關聯類型:多個子實體指向同一父實體(如:多個 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
}
| 特徵 | 一對一 | 多對一 |
|---|---|---|
| 指向端基數 | 1 | 多 |
| 外鍵唯一性 | 唯一 (unique=true) | 非唯一 |
| 映射標籤 | <many-to-one unique="true"> | <many-to-one> |
| 資料庫結構 | 外鍵加 UNIQUE 約束 | 普通外鍵 |
結論:一對一是多對一的特例(加上唯一約束)。
| 表 | 欄位 |
|---|---|
| t_group | id (PK), name |
| t_user | id (PK), name, groupid (FK) |
<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>。