使用JPA </locale,string>存储Map <locale,string>

时间:2013-12-26 08:16:31

标签: java jpa orm

使用JPA注释存储Map<Locale,String>属性的最简单方法是什么?我正在处理的应用程序需要存储多语言文本 - 它(基本上)是相同的文本,但是用多种语言编写。

请注意,大量实体需要此类属性(每个实体都有多个此类属性)。因此,解决方案需要易于复制,而不是将gob和gob代码复制粘贴到每个实体。

为了说明,应用程序需要存储以下内容的数据: enter image description here

(注意同一项目用五种语言书写)

1 个答案:

答案 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.
}