我正在做一个项目,其中一些数据以多种语言存储。为了持久化,我将 Spring Data JPA 与 Hibernate 结合使用。我的模型如下:
我有一个可嵌入的类,用于在给定的语言环境中存储字符串:
@Embeddable
public class MultilingualData {
@Column(name = "locale", nullable = false)
@Convert(converter = LocaleConverter.class)
private Locale locale;
@Column(name = "value")
private String value;
}
我还有一个类,我想在其中使用 MultilingualData 作为 Map 的值,并将 MultilingualData 中的 Locale 作为键以进行更好的处理。
@Entity
@Table(name = "multilingual_string")
public class MultilingualString extends BaseEntity {
private static final long serialVersionUID = -2434353448112062292L;
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyJoinColumn(name = "locale", insertable = false, updatable = false)
@CollectionTable(name = "multilingual_string_map",
joinColumns = @JoinColumn(name = "string_id"))
private Map<Locale, MultilingualData> localizedStrings;
我使用 MultilingualString 的类:
@Entity
@Table(name = "location")
public class Location extends BaseEntity {
private static final long serialVersionUID = 1L;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "name")
private MultilingualString name;
因此,当 JPA 生成表时,会在“multilingual_string_map”中为语言环境本身生成两列。一个名称为“locale”,如模型中给出的那样,它创建另一个名称为“localized_strings_key”作为主键的一部分。所以当我存储多语言数据时,语言环境被保存了两次。
我想去掉那个多余的列,因为它是多余的。我知道我没有正确配置映射,所以我希望有人能在这里纠正我的错误。 提前致谢!
最佳答案
为什么要将连接列定义为 insertable = false
? map 永远不会从您的代码中填充吗?
在任何情况下,@MapKeyJoinColumn
仅在 map 键为实体时使用。 @MapKeyColumn
就是你想要的。
(您的模型中缺少 @MapKeyColumn
的事实意味着 Hibernate 被迫为键列使用默认名称,即 localized_strings_key
。locale
列也被创建,尽管 map 键不是一个实体是,嗯,未记录的行为)
关于java - 映射列的 JPA i18n 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42117775/