首页 > 解决方案 > 如何在 Hibernate/JPA 中持久化 EnumMap?

问题描述

我目前正在尝试保留我Map在 Java 中存储为 a 的数据。我已经开始使用它List了,但是当我尝试Map使用它来代替它时@MapKeyEnumerated@MapKey它的行为有点出乎意料。

ExampleData.java

@MapKey(name = "feature")
@MapKeyEnumerated(EnumType.STRING)
@OneToMany(targetEntity = ExampleFeature.class, mappedBy = "exampleData")
private Map<Feature, ExampleFeature> features;

ExampleFeature.java

@ManyToOne
@JoinColumn(name = "example_id", nullable = false)
private ExampleData exampleData;

@Enumerated(EnumType.STRING)
@Column(name = "feature", nullable = false)
private Feature feature;

我能够在运行时之外手动向数据库添加行,并且在运行应用程序时它能够正确加载这些实体。所有其他实体也在按预期工作。

当从应用程序中持久化实体时,ExampleFeature确实会出现在 中Map,但实例中的所有属性都是默认的 Java 值,并且在退出之后

依赖项

谁能指出我在这里可能有什么问题的正确方向?

标签: javahibernatejpa

解决方案


问题是在项目中,#save()只调用了ExampleData,而不是它下的任何关系属性。这意味着 Hibernate 会尝试持久化ExampleData实例,但不会保留任何嵌套属性,例如EnumMap.

解决方案是设置cascade = CascadeType.ALLwhich 将告诉 Hibernate 持久化关系实体中的更改,例如ExampleFeature持久化时ExampleData

ExampleData.java

@MapKey(name = "feature")
@MapKeyEnumerated(EnumType.STRING)
@OneToMany(targetEntity = ExampleFeature.class, mappedBy = "exampleData", cascade = CascadeType.ALL)
private Map<Feature, ExampleFeature> features;

推荐阅读