将 Map<Enum, Enum> 以字符串形式存储

9

我需要帮助在JPA2中存储一个包含枚举类型作为键和值的映射(Map<Enum, Enum>)。使用Hibernate作为JPA提供程序时,它会将枚举类型存储为二进制大型对象(blob),但我需要将数据存储为字符串。我尝试使用以下注解来解决此问题:

@ElementCollection(fetch = FetchType.EAGER)
@MapKeyEnumerated(value = EnumType.STRING)
public Map<Enum, Enum> getElementsMap() {
    return elementsMap;
}

但是数据仍然以 blob 的形式存储在数据库中。有没有人解决过这个问题?

3
将地图保存为字符串听起来不太合理。你听说过数据规范化吗? - Niklas B.
1
我不认为这是非常基础的东西,看看这篇帖子: https://forum.hibernate.org/viewtopic.php?f=1&t=999270&start=0 也许你应该参考一本Java入门书。 - user1289877
@Niklas B. 在你写任何东西之前,如果有人建议你应该阅读一些东西,请三思而后行!如果你真的不理解一个问题,也不知道具体的解决方案,请不要用无关的评论垃圾邮件式地提问,并在发布答案之前尝试学习一些东西。 - user1289877
首先,每个“初学者”都知道,枚举使用name()方法来转换其实例(这是最佳实践)。其次,我没有任何错误消息(您应该仔细再次阅读我的问题)。如果您具备像您展示的那样的技能,那么将这些非常基本的事情放在一起并编写正确的答案(对您来说这将是非常简单的事情),否则请不要浪费我的时间和您的时间与您无关的答案! - user1289877
那你应该当时就把这个说清楚了。 - Niklas B.
显示剩余7条评论
2个回答

3

@Enumerated用于定义值的类型。以下映射到表格,其中键和值的列都是varchars,并且枚举的名称将被保存:

@Enumerated(EnumType.STRING)
@ElementCollection(fetch = FetchType.EAGER)
@MapKeyEnumerated(value = EnumType.STRING)
public Map<MyEnum, MyOtherEnum> elementsMap = new HashMap<>();

它将生成大致如下表格:
[NAME_OF_ENTITY]_ELEMENTSMAP (
  NAME_OF_ENTITY_ID INTEGER, 
  ELEMENTSMAP VARCHAR(255), 
  ELEMENTSMAP_KEY VARCHAR(255)
)

感谢您发布的内容,我尝试了一下,但没有帮助到我。我使用的是PostgreSQL数据库和Hibernate在表中创建int8、bytea、bytea数据类型。 - user1289877

1
几乎每个Java对象都有一个toString()方法。如果您想在数据库中表示您的Map,则建议选择此选项。
但我必须问您确定要存储的是MAP而不是键或值的元素吗?

是的,它是键和值。抱歉我刚开始学习JPA2和Hibernate,请问您能否在此处发布代码更改,以便我将这些键和值存储为字符串? - user1289877

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接