gpt4 book ai didi

java - 映射列的 JPA i18n 问题

转载 作者:行者123 更新时间:2023-11-29 03:22:20 24 4
gpt4 key购买 nike

我正在做一个项目,其中一些数据以多种语言存储。为了持久化,我将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com