java - 如何在 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 值,并且在退出之后
依赖项
谁能指出我在这里可能有什么问题的正确方向?
解决方案
问题是在项目中,#save()
只调用了ExampleData
,而不是它下的任何关系属性。这意味着 Hibernate 会尝试持久化ExampleData
实例,但不会保留任何嵌套属性,例如EnumMap
.
解决方案是设置cascade = CascadeType.ALL
which 将告诉 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;
推荐阅读
- kubernetes - 无法使用入口连接到 pod
- php - Woocommerce - 伙计们,我正在尝试显示 3 个随机产品,但跳过了前 3 个最近添加的产品
- php - 没有 Angular 或 React 的混合应用程序开发
- c# - 无法设置公共文本 = 公共字符串 []
- android - Android所有活动中的浮动弹出窗口
- pip - 如何修复“枕头上的 pip 安装错误”
- java - JPA,如何将 Map 中实体类型的值添加到主键?
- c - 使用 GDB 的缓冲区溢出、堆栈指针操作
- javascript - 快速重复ajax程序有什么危险吗?
- java - java.lang.Error java.util.ArrayList$ArrayListIterator.next