我有一个带有对象的数据库,它有翻译.
有2个表:table具有id和更多属性的对象和具有object_id,language(varchar)和translation(varchar)的表’object_translation’
我想把这个映射到
public class Object {
private Map<Language, String> translations
}
其中language是代码中的枚举,DB中是字符串.
这可能带注释吗?或者我是否需要创建Collection< QuestionTranslation>或者在DAO中编写我自己的hibernate映射函数(我使用的是spring-data,所以我更喜欢将它作为接口和注释保持良好和干净)
版本:spring-boot 2,提供spring-boot-starter的休眠:
spring boot: <version>2.0.3.RELEASE</version>
<hibernate.version>5.2.17.Final</hibernate.version>
<hibernate-jpa-2.1-api.version>1.0.2.Final</hibernate-jpa-2.1-api.version>
到目前为止我有这个:
@OneToMany
@JoinTable(name = "object_translation", joinColumns = {@JoinColumn(name = "object_id", referencedColumnName = "id")})
@MapKey(name = "language")
@MapKeyEnumerated(EnumType.STRING)
private Map<Language, String> translations;
但是我如何映射价值呢? (澄清:String值应该是DB中的翻译列)
因为我没有主键,理论上这应该是可能的吗?
提前致谢!
最佳答案 我设法修复它=)
你不应该使用@OneToMany.
我用过的:
public class Object {
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "object_translation",
foreignKey = @ForeignKey(value = ConstraintMode.CONSTRAINT, name = "fk_object_translation_object"),
joinColumns = @JoinColumn(name = "object_id"))
@MapKeyColumn(name = "language", nullable = false)
@MapKeyEnumerated(EnumType.STRING)
@Column(name = "translation", nullable = false)
private Map<Language, String> translations;
}