当前位置: 首页 > 知识库问答 >
问题:

在具有Hibernate的实体中映射java.util.地图

郁灿
2023-03-14

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

私有地图属性;

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

这样,我就可以在数据库中存储此属性的数据:

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

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

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

在我的视图中,使用thymeleaf实现,我希望阅读与用户语言相关联的文本。

任何人都可以告诉我,是否有一种方法,使用Hibernate来映射这种od字段?

共有2个答案

班昱
2023-03-14
@OneToMany
private Map<String, String> attribute;

如果您的列名与JPA的默认值不匹配,请添加@MapKeyColumn和/或@Column。对映射使用泛型(Map

庄智
2023-03-14

您可以按照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_表将有4列。ID列作为主键,mapKeyvarchar(255)),mapValuevarchar(255)),以及fooId作为外键。

应用于地图的注释执行以下操作:

@ElementCollection(fetch=FetchType.EAGER)-告诉Hibernate您有一个元素(字符串)的集合,并且应该总是急切地获取这些元素。如果您永远不希望地图为空,请应用此选项。另一方面,如果获取映射是一个昂贵的查询,或者映射将特别大,并且您并不总是需要它,请设置FetchType。而是懒惰的。(请参见此处,了解急切抓取与懒惰抓取的详细概念)

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

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

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

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

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

 类似资料:
  • 我在Kotlin-vertx项目中配置了Hibernate,我设法设置了所有内容,但当我运行HQL查询时,它会输出: 提前谢了。

  • Hi编写Spring应用程序,使用Spring Security。这是我的用户和帐户角色数据库: 我的实体类: 当我尝试登录我的系统我有错误: Hibernate:选择userrolese0_. username作为username3_1_0_,userrolese0_. id作为id1_0_0_,userrolese0_. id作为id1_0_1_,userrolese0_. name作为nam

  • 问题内容: 特定实体存在映射例外。不能弄清楚问题出在哪里。我从头到尾检查了所有映射3次。我仍然收到映射异常。 发送给员工的电子邮件仅映射一次。但它仍然报告错误重复映射 错误是: 电子邮件Pojo email.hbm.xml 相关脚本 发送给员工的电子邮件仅映射一次。但它仍然报告错误重复映射 问题答案: 您是否将Employee中的集合设置为逆?

  • 是否有可能不在HiberNate中的实体层次结构中间为类创建表? 我想指出某些实体是某种类型的子集,以便返回所有这些实体的集合,但我不会在此中间类型中放置任何额外的属性。因此,保留带有id字段的额外表只是为了连接表,这听起来并不好。 更好的解决方案是实现一些公共接口< code>CommonInterface,但是这样我就失去了返回< code>List的可能性

  • 我有5个班叫 1.Reqest->与请求表映射 2.Team->与Team表映射 假设我创建了一个bean类,如下所示。 现在,由于我已经用Java类映射了所有表,所以我可以使用hql联接查询来获取数据。 我不想在连接中使用纯SQL查询,然后手动将结果Object[]列表从hibernate查询和存根数据迭代到SummaryBean中。 我的问题是我如何使hibernate将那个查询的结果映射到S

  • 我这里有一个奇怪的问题,如果我错了,请原谅我。 我这里的问题是,我在应用程序中为两个实体定义了一个manytone映射。删除时,我想忽略删除其他实体。 假设Emp到Dept有多个关系,我正在通过会话删除Emp记录。删除(EmpId),此时我不想删除与Emp实体关联的部门。 我不能在hbm中改变级联选项。 这种情况类似于 “如果有10个emp属于部门编号101,并且在删除任何一个emp时,它也将尝试