java - 映射列的 JPA i18n 问题

标签 java mysql spring hibernate jpa

我正在做一个项目,其中一些数据以多种语言存储。为了持久化,我将 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_keylocale 列也被创建,尽管 map 键不是一个实体是,嗯,未记录的行为)

关于java - 映射列的 JPA i18n 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42117775/

相关文章:

java - JUnit 和 Mockito 空指针异常

sql - MySQL:子查询中的总和值

javascript - 使用 jquery 更改 id attr 的值

java - 在 Java 中使用注解进行授权检查

java - 在 Java 中,如何有效地从 ArrayList<StringBuilder> 中删除重复项?

java - 如何在 hibernate 映射中添加另一个搜索参数?

php - Laravel 4.2 多对多关系,使用其他默认 ID

java - 如何实际测试具有空指针异常的 Controller 的服务器响应

java - 使用tomcat在spring boot上读取控制台输入

spring - spring如何跨多个类使用redis事务?