在我目前的春季项目中,我正在寻找一种方法来映射我的一个实体中的字段:
私人地图属性;
其中键的类型应该是表示语言的双字符串,并且值的类型应该是大约128Kb长度的字符串。
有了这个,我应该可以在我的数据库中使用这样的东西来存储这个属性的数据:
<select name="..." multiple="multiple">
<option value="..."> ... </option>
</select>
<textarea name="..."> ... </textarea>
在选择中我选择一种语言并在textarea中输入我以所选语言插入文本。
在我的观点中,使用百日咳实施,我想阅读与用户语言相关的文字。
任何人都可以告诉我是否有办法使用Hibernate来映射这种od字段?
答案 0 :(得分:4)
您可以执行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
作为外键。
应用于地图的注释执行以下操作:
@ElementCollection(fetch=FetchType.EAGER)
- 告诉Hibernate你有一个元素集合(String&#39; s),并且应该总是急切地获取这些元素。如果您从不希望地图为空,请应用此选项。另一方面,如果提取地图是一个昂贵的查询,或者地图会特别大,而您并不总是需要它,请设置FetchType.LAZY
。 (有关EAGER与LAZY获取的深入概念,请参阅here)
@CollectionTable
- 告诉Hibernate您的集合值存储在表中。表名由name
参数指定,FK列使用@JoinColumn
注释指定。
@MapKeyColumn
- 指向包含地图关键字值的列。
@Column
- 指向包含地图值值的列。
如果您愿意,可以轻松更改@MapKeyColumn
和@Column
的值。
请注意,如果您发现未在地图中返回不同的值,请尝试将@Fetch(FetchMode.SUBSELECT)
添加到集合中。这表明Hibernate应该选择地图值而不是尝试将它们连接到您的父级。
答案 1 :(得分:1)
@OneToMany
private Map<String, String> attribute;
如果您的专栏名称与JPA的默认设置不匹配,请添加@MapKeyColumn
和/或@Column
。为地图使用泛型(Map<String, String>
),这样您就不必手动指定类型。