【问题标题】:How to define an attribute of a class as key for a map?如何将类的属性定义为地图的键?
【发布时间】:2021-10-06 03:11:00
【问题描述】:

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

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

你能帮帮我吗?

谢谢你。

【问题讨论】:

    标签: hibernate jpa orm entity spring-boot-jpa


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我不知道@Embeddable。我已经以一种可行的方式对此进行了编码,但是我必须手动分配一个“fr”才能让它出现在.get(lang)中。即使做得不是​​很好,它也能工作......我必须推进我的发展......
    • 此外,当我与您交谈时,我正在生产中测试它,如果我制作的方式有效,显然它有效。关于在另一列中手动添加语言,它是在 CSV 中大量数据导入的框架内......因此它是一个执行此重复的批处理脚本......因此在使用上有点透明/ Spring Boot 的开发方面
    • 我只是重复了几次“fr”这个词......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2013-09-29
    相关资源
    最近更新 更多