簡體   English   中英

如何映射地圖 <String, List<String> &gt;在休眠狀態

[英]How to map Map<String, List<String>> in hibernate

我正在使用當前的Spring Data JPA,我想映射一個屬性

@Entity
public class Outer {
    ...
    Map<String, List<String>> typesToCategories;
}

假設我有一個table outerouter_type_category 第一個是微不足道的:只有列outer_id與它相關

CREATE TABLE outer_types_categories ( 
    id        uuid                        NOT NULL,
    outer_id  uuid                        NOT NULL,
    type      character varying(128)      NOT NULL,
    category  character varying(128)      NOT NULL,
    ...
 )

我應該使用哪些注釋(如果可能的話)將此表映射到地圖?

我試過用這個

    @ElementCollection
    @CollectionTable(name = "outer_type_category", joinColumns = [JoinColumn(name = "outer_id")])
    @MapKeyColumn(name = "type")
    @Column(name = "category")
    Map<String, List<String>> typesToCategories;

但最后我看到一個例外:

Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: outer_type_category, for columns: [org.hibernate.mapping.Column(category)]

我忘了什么嗎?

JPA指定了

實體或可嵌入類的持久字段或屬性可以對應於基本類型或可嵌入類的集合(“元素集合”)。

(JPA 2.2規范,第2.6節;增加了重點)

java.util.List既不是基本類型也不是可嵌入類,因此它不屬於元素集合的允許元素類型。 此外,JPA繼續說

包含在元素集合中的可嵌入類[...]不得包含元素集合

,所以即使用可嵌入類替換List也沒有為你提供一個合適的機制來映射你所描述的結構。 如果您根本不願意或根本無法更改數據庫結構,那么我認為您不能以與您描述的方式類似的方式映射您的表。

如果你至少可以向數據庫添加一個新表,那么你可以引入一個表示地圖中一個條目的新實體,比如說OuterType ,它有一個映射到你的outer_types_categories表的元素集合。 它可能需要具有對應於(outer_id, type)的復合ID。 即使這樣,數據庫端也需要設置為自動將值分配給集合表的id列(除非您可以刪除該列,實際上這對於您的明顯目的似乎沒有用),因為成員元素集合不是實體,因此JPA不會將ID歸於它們。 此外,(在JPA方面)有一個列既是復合主鍵的一部分又是相關實體的外鍵,這是必要的。

如果你有更多的自由來修改數據庫結構,那么我會建立上述OuterType與標准,代理ID以及與雙向one-to-一個關系的實體Outer ,在代表Outer側的地圖。 使用默認映射策略設置包含OuterType中的類別字符串的元素集合,該策略將使用OuterType的(代理)ID以及集合表中的“type”和“outer_id”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM