Java 带有映射列的JPA i18n问题

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

我正在做一个项目,其中一些数据以多种语言存储。对于持久性,我使用Spring数据JPA和Hibernate。我的模型如下:

我有一个可嵌入类,用于在给定区域设置中存储字符串:

@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;