如何将类的属性定义为地图的键?

问题描述

这是我第一次用 Maps 做 JPA 的持久化。 我也在概念层面上迷失了自己。

我有一个对象 (poi),它没有一个或多个不同语言的描述。 我希望 poi 对象有一个地图 [lang,description]

@Entity
public class Poi {
    @Id
    @Column(name = "id")
    private Long id;
    @OnetoMany(cascade = CascadeType.ALL)
    @JoinTable(name = "description_poi_mapping",joinColumns = {@JoinColumn(name = "poi_id",referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name = "description_id",referencedColumnName = "id")})

   @MapKeyJoinColumn(name = "lang_id")
   @MapKey
    private Map<Lang,Description> descriptionCourte;

说明:

@Entity
public class Description {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String label;
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "lang_id")
    private Lang lang;

朗:

@Entity
public class Lang {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "id")

    private Long id;
    @Column(name = "label")
    private String label;

因此,描述包含附加到语言的标签(fr、en、it、de、...) 我希望我能做到,在地图上;

> poi.getDescriptionCourte().get("en") or
> poi.getDescriptionCourte().get("fr")

基本上,地图的键是语言标签(如果存在)。如果“poi”有1个英文描述和1个法语描述,那么我的地图必须有2个记录,其键值为“fr”或“en”(为“lang”记录的标签

当然,目标是能够将 lang 类重用于其他描述。

排除我当前的结果根本不是我想要的,这里是:

debug

你能帮我吗?

谢谢。

解决方法

这不是直接可能的。您可以实现 equalshashCode/Lang 以便仅使用标签,然后您可以访问 poi.getDescriptionCourte().get(new Lang("fr")) 之类的元素或将其抽象为单独的方法 {{1}这做我之前写的。请注意,这需要您获取所有 Lang 对象,即在当前会话/entityManager 中有它们的托管表示,因此我建议您使用 poi.getDescriptionCourte("fr") 代替它由 Hibernate 映射到仅包含本地代码。您还可以将 Locale 建模为 Lang 或提供在 @EmbeddableAttributeConverter 之间转换的 String。这样,就不需要额外的连接/获取。