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

Hibernate 集合類型映射完整指南:List、Set、Map、Bag、Array 關聯關係配置詳解

     編輯:Java 相關知識

Hibernate 集合映射核心概念

Hibernate 支援將 Java 集合類型映射為資料庫關聯關係,主要分類:

集合介面特性資料庫表現適用場景
List有序、可重複索引欄位 (list_index)順序重要的集合
Set無序、不可重複無索引,靠主鍵/唯一約束唯一性關聯
Map鍵值對、鍵唯一鍵欄位 (map_key)鍵值關聯查詢
Bag無序、可重複無索引,允許重複行效能最佳(無序)
Array固定長度、有序索引欄位陣列屬性映射

單向一對多映射配置

實體類別定義

@Entity
public class Department {
    @Id @GeneratedValue
    private Long id;
    private String name;
    
    @OneToMany
    @JoinColumn(name = "dept_id") // 外鍵在 Employee 表
    private List employees = new ArrayList<>();
    // getter/setter
}

@Entity
public class Employee {
    @Id @GeneratedValue
    private Long id;
    private String name;
    // 無反向關聯
}

XML 映射檔對應

<class name="Department" table="DEPARTMENT">
  <id name="id" column="DEPT_ID">
    <generator class="native"/>
  </id>
  <property name="name" column="DEPT_NAME"/>
  
  <list name="employees" table="EMPLOYEE">
    <key column="DEPT_ID"/>
    <list-index column="EMP_IDX"/>
    <one-to-many class="Employee"/>
  </list>
</class>

雙向一對多 / 多對一映射

@Entity
public class Department {
    @OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
    private Set employees = new HashSet<>();
}

@Entity
public class Employee {
    @ManyToOne
    @JoinColumn(name = "DEPT_ID")
    private Department department;
}

關鍵點:mappedBy 指定關係擁有方,cascade 定義級聯操作。

集合映射進階配置

List 保持順序

@OrderColumn(name = "DISPLAY_ORDER") // JPA 2.0
private List tasks;

或 XML:<list-index column="DISPLAY_ORDER"/>

Map 鍵值映射

@Entity
public class Student {
    @ElementCollection
    @CollectionTable(name = "STUDENT_SCORES", joinColumns = @JoinColumn(name = "STUDENT_ID"))
    @MapKeyColumn(name = "SUBJECT")
    @Column(name = "SCORE")
    private Map scores = new HashMap<>();
}

Bag 最佳效能配置

@OneToMany(mappedBy = "order")
@OrderBy("id") // 僅查詢排序,不維護索引
private Collection items = new ArrayList<>(); // 宣告為 Collection

集合元素類型:基本型別、嵌入物件、實體

類型註解資料表
基本型別/字串@ElementCollection單獨集合表
嵌入物件@ElementCollection + @Embeddable單獨集合表
實體關聯@OneToMany / @ManyToMany實體表 + 關聯表

常見問題與優化

問題原因解決方案
N+1 查詢集合預設 LAZY 載入FetchType.EAGER / join fetch / @BatchSize
重複資料Bag 允許重複 + join fetch改用 Set 或 distinct 查詢
索引維護開銷List/Array 更新索引改用 Bag/Set 或 @OrderBy
孤兒刪除移除集合元素未刪除實體orphanRemoval=true + cascade=ALL

最佳實踐建議

  1. 優先使用 Set/Bag:無序集合效能最佳,避免索引維護
  2. 明確指定 Fetch 策略:預設 LAZY,按需 JOIN FETCH
  3. 使用 @OrderBy 替代 @OrderColumn:查詢層面排序,不持久化索引
  4. 雙向關聯必雙向維護:新增/移除元素時同步雙向引用
  5. 集合初始化:宣告時初始化避免 NPE

XML 與註解對照速查


<list name="items">
  <key column="PARENT_ID"/>
  <list-index column="IDX"/>
  <one-to-many class="Child"/>
</list>


<set name="items">
  <key column="PARENT_ID"/>
  <one-to-many class="Child"/>
</set-->


<map name="items">
  <key column="PARENT_ID"/>
  <map-key column="MAP_KEY"/>
  <one-to-many class="Child"/>
</map-->


<bag name="items">
  <key column="PARENT_ID"/>
  <one-to-many class="Child"/>
</bag-->
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved