使用 JPA 存储地图<String,String>

问题描述 投票:0回答:3
我想知道是否可以使用注释将

attributes

 映射保留在使用 JPA2 的以下类中

public class Example { long id; // .... Map<String, String> attributes = new HashMap<String, String>(); // .... }

由于我们已经有一个预先存在的生产数据库,因此理想情况下

attributes

 的值可以映射到以下现有表:

create table example_attributes { example_id bigint, name varchar(100), value varchar(100));
    
java jpa orm jpa-2.0
3个回答
217
投票
JPA 2.0 通过

@ElementCollection

 注释支持基元集合,您可以将其与 
java.util.Map
 集合的支持结合使用。
像这样的东西应该有效:

@Entity public class Example { @Id long id; // .... @ElementCollection @MapKeyColumn(name="name") @Column(name="value") @CollectionTable(name="example_attributes", joinColumns=@JoinColumn(name="example_id")) Map<String, String> attributes = new HashMap<String, String>(); // maps from attribute name to value }

另请参阅(JPA 2.0 规范中)

    2.6 - 可嵌入类和基本类型的集合
  • 2.7 地图收藏
  • 10.1.11 - ElementCollection 注释
  • 11.1.29 MapKeyColumn注解

23
投票
@ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "raw_events_custom", joinColumns = @JoinColumn(name = "raw_event_id")) @MapKeyColumn(name = "field_key", length = 50) @Column(name = "field_val", length = 100) @BatchSize(size = 20) private Map<String, String> customValues = new HashMap<String, String>();

这是一个关于如何设置映射并控制列和表名称以及字段长度的示例。


0
投票
@ElementCollection @MapKeyColumn(name="lang_code") @Column(name="client_name") @CollectionTable(name="client_name_lang", joinColumns=@JoinColumn(name="client_id")) private Map<StringString> clientNameLangMap;
注意要点:

    @ElementCollection:表示地图是一个集合 本身不是实体的元素。
  1. @MapKeyColumn(name="lang_code"):指定MapKeyColumn中的列 将存储地图键的集合表。
  2. @Column(name="client_name"):指定集合中的列 将存储地图值的表。
  3. @CollectionTable(name="client_name_lang", joinColumns=@JoinColumn(name="client_id")):定义表 将用于存储地图。 joinColumns 属性指定 将映射条目链接到实体的外键列。
此设置将创建一个单独的表(本例中为 client_name_lang)来存储映射条目,每个条目由 lang_code 和 client_name 列组成。 client_name_lang 表中的 client_id 列将用作将每个映射条目链接回 ClientDetail 实体实例的外键。

© www.soinside.com 2019 - 2024. All rights reserved.