【问题标题】:JPA: persist a Map including the original "key" valueJPA:持久化包含原始“键”值的地图
【发布时间】:2015-02-22 19:47:07
【问题描述】:

我需要使用 JPA 存储一个复杂的树状对象结构。

有一个“顶级”A 类,因此我可以在其上执行 CASCADE.ALL,但我遇到了 B 类的子对象和 HashMap 字段的问题。

Map 的“键”是对象本身的哈希码,存储为“值”。

当我级联持久化对象 B 时,数据库中的“键”列始终为“空”(为什么?),即使该对象有一些键值对。

我尝试了一些类似@MapKey 的东西,但是当我稍后从数据库中加载对象时,键值不再是哈希码,而是自动生成的 id(对我没用)。

我也为地图尝试了@ElementCollection,但随后出现同步错误(我认为这是因为我仅从顶级类触发整个持久化,并且一些对象指向彼此)。

@Entity
public class B
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @OneToMany(cascade = CascadeType.ALL)
    //Tried @MapKey or @ElementCollection
    public Map<Integer, OtherEntity> otherEntities;

感谢您的帮助, 亚历克斯

【问题讨论】:

    标签: java hibernate jakarta-ee jpa eclipselink


    【解决方案1】:
    @MapKey(name="hashField")
    

    哈希值必须显式存储在 OtherEntity.hashField 中。 mapkey 用于告诉其他对象属性中的哪个作为键值

    【讨论】:

    • 所以这意味着我的 otherEntity 对象需要一个新的变量字段来存储它们的 hascode?对不起,如果这是一个转储问题。我是初学者..
    • 是的。因此,无论何时更改实体对象的字段值,您都必须记住对其进行更新。我不知道你为什么选择键作为hascodes(除非你ment DB hashcodes但是java不会知道它们)。为确保 hashValue 始终更新,您可以在每次 JPA 更新/持久之前调用重新计算方法 en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Events
    猜你喜欢
    • 2023-03-11
    • 2016-03-09
    • 2016-02-20
    • 2015-02-27
    • 2014-12-04
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2017-10-10
    相关资源
    最近更新 更多