Java 带有映射列的JPA i18n问题
我正在做一个项目,其中一些数据以多种语言存储。对于持久性,我使用Spring数据JPA和Hibernate。我的模型如下: 我有一个可嵌入类,用于在给定区域设置中存储字符串:Java 带有映射列的JPA i18n问题,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我正在做一个项目,其中一些数据以多种语言存储。对于持久性,我使用Spring数据JPA和Hibernate。我的模型如下: 我有一个可嵌入类,用于在给定区域设置中存储字符串: @Embeddable public class MultilingualData { @Column(name = "locale", nullable = false) @Convert(converter = LocaleConverter.class) private Locale loc
@Embeddable
public class MultilingualData {
@Column(name = "locale", nullable = false)
@Convert(converter = LocaleConverter.class)
private Locale locale;
@Column(name = "value")
private String value;
}
我还有一个类,我想使用多语言数据作为地图的值,多语言数据中的语言环境作为更好处理的关键
@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;
因此,当JPA生成表时,在“多语言字符串映射”中,会为语言环境本身生成两列。其中一个名为“locale”,如模型中所示,它创建另一个名为“localized_strings_key”的,作为主键的一部分。因此,当我存储多语言数据时,区域设置会保存两次
我想去掉那个额外的列,因为它是多余的。我知道我没有正确配置映射,所以我希望有人能在这里纠正我的错误。
提前谢谢 为什么要将联接列定义为
insertable=false
?是否永远不会从代码中填充映射
在任何情况下,@MapKeyJoinColumn
仅在映射键为实体时使用@MapKeyColumn
就是您想要的
(您的模型中缺少@MapKeyColumn
这一事实意味着Hibernate被迫为键列使用默认名称,即本地化的\u strings\u key
。尽管映射键不是实体,但还是创建了区域设置
列,这一事实是未记录的行为)
@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;