0

这是我第一次使用 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 类重用于其他描述。

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

调试

请问你能帮帮我吗 ?

感谢您。

4

1 回答 1

1

这不是直接可能的。您可以实现equals/ hashCodeofLang这样只使用标签,然后您可以访问类似的元素poi.getDescriptionCourte().get(new Lang("fr"))或将其抽象为单独的方法poi.getDescriptionCourte("fr"),该方法执行我之前编写的操作。请注意,尽管这需要您获取所有 Lang 对象,即在当前 session/entityManager 中有它们的托管表示,所以我建议您改用Locale由 Hibernate 映射到仅包含本地代码的字符串列。您还可以建模Langas@Embeddable或提供在和AttributeConverter之间转换的 an 。这样,不需要额外的连接/获取。StringLang

于 2021-08-05T09:53:45.740 回答