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

Hibernate 組合映射深度解析:Component 映射實戰教學

     編輯:Java 相關知識

什麼是組合映射?

組合是關聯關係中耦合度最高的一種:主物件與子物件共享相同生命週期,主物件消失則子物件隨之消失。以「員工/用戶」與「聯絡資訊」為例,雙方都擁有聯絡資訊屬性(email、address、zipCode、contactTel)。若從物件導向角度建模,可將聯絡資訊抽象為獨立 Contact 類別,員工與用戶各自包含一個 Contact 物件,形成組合關係。

資料庫結構:扁平化儲存

Hibernate 將組合物件的屬性「扁平化」映射到主表中,不建立獨立子表。t_employee 與 t_user 表皆包含 contact 相關欄位:

create table t_employee (
    id integer not null auto_increment,
    name varchar(255),
    email varchar(255),
    address varchar(255),
    zipCode varchar(255),
    contactTel varchar(255),
    primary key (id)
);
-- t_user 結構相同

實體類與映射檔實作

1. Contact 類別(無需獨立映射檔)

public class Contact {
    private String email, address, zipCode, contactTel;
    // getter/setter 略
}

2. Employee 類別與 Employee.hbm.xml

public class Employee {
    private int id;
    private String name;
    private Contact employeeContact; // 組合物件
    // getter/setter 略
}
<hibernate-mapping>
    <class name="com.src.hibernate.Employee" table="t_employee">
        <id name="id"><generator class="native"/></id>
        <property name="name"/>
        <component name="employeeContact">  
            <property name="email"/>
            <property name="address"/>
            <property name="zipCode"/>
            <property name="contactTel"/>
        </component>
    </class>
</hibernate-mapping>

3. User 類別與 User.hbm.xml(結構同 Employee)

<component name="userContact">
    <property name="email"/>
    <property name="address"/>
    <property name="zipCode"/>
    <property name="contactTel"/>
</component>

資料操作:存取如同單一表

因組合映射產生扁平化表結構,寫入與讀取皆採用最基本的 save / load 即可,無需特殊處理。

寫入範例

Session session = HibernateUtils.getSession();
session.beginTransaction();

Contact contact = new Contact();
contact.setAddress("北京市");
contact.setContactTel("1243435");
contact.setEmail("123@gmail.com");
contact.setZipCode("100000");

User user = new User();
user.setName("zhangsan");
user.setUserContact(contact); // 只需儲存 user,contact 會級聯保存

session.save(user);
session.getTransaction().commit();

生成 SQL:insert into t_user (name, email, address, zipCode, contactTel) values (?, ?, ?, ?, ?)

讀取範例

User user = (User) session.load(User.class, 1);
System.out.println("用戶姓名:" + user.getName());
// 會自動填充 userContact 所有屬性

綜合範例:Account + Address

另一個經典案例:帳戶包含地址資訊。

public class Account implements Serializable {
    private int id;
    private double money;
    private Address address; // 組合物件
    // getter/setter
}

public class Address implements Serializable {
    private String code, city, province;
    // getter/setter
}
<component name="address">
    <property name="code"><column name="code"/></property>
    <property name="city"><column name="city"/></property>
    <property name="province"><column name="province"/></property>
</component>

關鍵總結

  • <component> 是組合映射的核心標籤,將子物件屬性內嵌至主表。
  • 子物件 不需要獨立的 hbm.xml,也不需配置 <class>。
  • 主物件與子物件生命週期綁定,儲存/刪除主物件自動級聯處理子物件。
  • 適用於「值物件」語意:無獨立身分識別、隨主物件生滅的領域概念。

掌握組合映射,能讓領域模型更豐富、資料庫結構更乾淨,是 Hibernate 進階必修課。

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