休眠:将两列映射到哈希映射的键和值



我有一个带有对象的数据库,它有翻译。

共有2个表:表Object具有id及以上属性,表'Object_translation'具有object_idlanguage(varchar(和translation(varchar(

我想把它映射到

public class Object {
private Map<Language, String> translations
}

其中语言是代码中的枚举和数据库中的字符串。

有了注释,这可能吗?或者我需要创建Collection<QuestionTranslation>,或者在DAO中编写我自己的hibernate映射函数吗(我使用的是spring数据,所以我更喜欢将其作为接口和注释保持整洁(

版本:春季启动2提供休眠从春季启动启动:

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;

但是我该如何映射价值呢?(为了澄清:字符串值应该是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;
}

从ORM的角度来看,这是无法实现的。并没有办法告诉ORM框架将String映射到Translation列。

实现这一点的最佳方法是使用带有mappedBy的@OneToMany或@ManyToMany将Object_Translation中的行检索为List或Set,然后编写自定义以将它们转换为映射。

最新更新