【问题标题】:Mapping a java.util.Map in a Entity with Hibernate使用 Hibernate 在实体中映射 java.util.Map
【发布时间】:2015-04-11 05:14:22
【问题描述】:

在我当前的春季项目中,我正在寻找一种方法来映射我的一个实体中的字段:

私有地图属性;

其中键的类型应该是代表语言的两个字符的字符串,值的类型应该是长度约为 128Kb 的字符串。

有了这个,我应该可以使用类似的东西在我的数据库中存储这个属性的数据:

<select name="..." multiple="multiple">
    <option value="..."> ... </option>
</select>

<textarea name="..."> ... </textarea>

在选择中我选择一种语言并在文本区域中输入我以所选语言插入文本。

在我看来,使用 thymeleaf 实现,我想阅读与用户语言相关的文本。

谁能告诉我是否有办法使用 Hibernate 来映射这种 od 字段?

【问题讨论】:

    标签: java spring hibernate dictionary


    【解决方案1】:

    您可以按照鸭步的建议进行操作,但如果您想更精细地控制映射表所在的位置,您可以使用以下注释。

    @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable(name = "FOO_TABLE", joinColumns = @JoinColumn(name = "fooId"))
    @MapKeyColumn(name="mapKey")
    @Column(name = "mapValue")
    private Map<String, String> fooMap = new HashMap<String, String>();
    

    这意味着 FOO_TABLE 将有 4 列。 ID 列作为主键,mapKey (varchar(255))、mapValue(varchar(255)) 和 fooId 作为外键。

    应用于地图的注释做了以下事情:

    @ElementCollection(fetch=FetchType.EAGER) - 告诉 Hibernate 你有一个元素集合(字符串),并且这些元素应该总是被急切地获取。如果您不希望您的地图为空,请应用此选项。另一方面,如果获取地图是一个昂贵的查询,或者地图会特别大并且您并不总是需要它,请改为设置FetchType.LAZY。 (有关 EAGER 与 LAZY 获取的深入了解,请参阅 here

    @CollectionTable - 告诉 Hibernate 您的集合值存储在表中。表名由name参数指定,FK列由@JoinColumn注解指定。

    @MapKeyColumn - 指向包含映射键值的列。

    @Column - 指向包含地图值的列。

    如果您愿意,可以轻松更改 @MapKeyColumn@Column 的值。

    请注意,如果您发现您没有在地图中返回不同的值,请尝试将 @Fetch(FetchMode.SUBSELECT) 添加到集合中。这表明 Hibernate 应该对映射值进行子选择,而不是尝试将它们连接到您的父级。

    【讨论】:

    【解决方案2】:
    @OneToMany
    private Map<String, String> attribute;
    

    如果您的列名与 JPA 的默认值不匹配,请添加 @MapKeyColumn 和/或 @Column。为您的 Map (Map&lt;String, String&gt;) 使用泛型,这样您就不必手动指定类型。

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 2010-11-27
      • 2020-02-21
      • 1970-01-01
      • 2017-06-06
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-09-20
      相关资源
      最近更新 更多