java - 使用 Hibernate 在实体中映射 java.util.Map

标签 java spring hibernate dictionary

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

私有(private) map 属性;

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

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

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

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

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

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

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

最佳答案

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

@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 作为外键。

应用于 map 的注释会执行以下操作:

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

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

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

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

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

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

关于java - 使用 Hibernate 在实体中映射 java.util.Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28444089/

相关文章:

java - 在区域设置“en_US”的代码 'user.title' 下找不到消息

java - Spring Boot中如果同时出现多个请求,如何保持多个请求?

java - 如何从主类之外访问 Spring bean

java - PostgreSQL 使用 JPA 和 Hibernate 抛出 "column is of type jsonb but expression is of type bytea"

java - "no result exception"用于 Spring @Service 的

java - 为什么我的 SQLiteOpenHelper 构造函数中出现 "incompatible types: Bla cannot be converted to Context"?

java - 从 Spring MVC 中的 Controller 获取选定的选项值

jpa 查询不会触发 hibernate envers

java - Hibernate + Spring 使用多个数据源?

java - AWS DynamoDB 多个 "NE"字符串过滤器?