使用JPA注释存储Map<Locale,String>
属性的最简单方法是什么?我正在处理的应用程序需要存储多语言文本 - 它(基本上)是相同的文本,但是用多种语言编写。
请注意,大量实体需要此类属性(每个实体都有多个此类属性)。因此,解决方案需要易于复制,而不是将gob和gob代码复制粘贴到每个实体。
为了说明,应用程序需要存储以下内容的数据:
(注意同一项目用五种语言书写)
答案 0 :(得分:2)
这是一个非常天真的实现,你需要根据自己的情况适当调整它。但是,要使此实现可重用,您需要一个包含该语言的可嵌入类 - &gt;文字映射。然后使用hashmap构建一个实体,因为你需要像一个唯一的ID。
@Embeddable
public class LocalizedString {
private String language;
private String text;
public LocalizedString() {}
public LocalizedString(String language, String text) {
this.language = language;
this.text = text;
}
// auto-generated getters, setters, hashCode(), equals(), etc.
}
@Entity
@Table(schema = "app", name = "mling_str")
public class MultilingualString {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "string_id")
private long id;
@ElementCollection(fetch = FetchType.EAGER)
@MapKey(name = "language")
@CollectionTable(schema = "app", name = "ming_str_map",
joinColumns = @JoinColumn(name = "string_id"))
private Map<String, LocalizedString> map = new HashMap<String, LocalizedString>();
public MultilingualString() {}
public MultilingualString(String lang, String text) {
addText(lang, text);
}
public void addText(String lang, String text) {
map.put(lang, new LocalizedString(lang, text));
}
public String getText(String lang) {
if (map.containsKey(lang)) {
return map.get(lang).getText();
}
return null;
}
// auto-generated getters, setters, hashCode(), equals(), etc.
}