【问题标题】:How to properly store array of enums in hibernate objects?如何在休眠对象中正确存储枚举数组?
【发布时间】:2013-01-05 19:32:27
【问题描述】:

我有一个实体 A,它包含一组标签,如下面的 sn-p:

@Entity
@Table(name = "tab_a")
public class A {

......

@Column(name = "name")
@ElementCollection(targetClass = Genre.class, fetch = FetchType.EAGER)
@CollectionTable(name = "tab_resource_tags", joinColumns = @JoinColumn(name = "id"))
@Enumerated(value = EnumType.STRING)
@OrderColumn
private Set<Genre> resourceTags;

------
}

我创建了一个额外的 tab_resource_tags 只是为了让这个东西正常工作,但是当我运行我的单元测试并将标签插入到类 A 中时,新创建的表仍然是空的。我真的不明白它的意义。

我的目标是将标签存储在存储“A”实体的同一个表中。理想情况下,它们应该是纯文本并用逗号分隔以便人类可读。

我的问题是:创建一个单独的表仅用于插入一组枚举/列表是否值得? 将枚举完全反映到数据库中并将其插入原始“A”表中不是更优雅吗?

任何与此相关的意见将不胜感激。

后期编辑:

作为一种解决方法,我尝试指定

@CollectionTable(name = "tab_a", joinColumns = @JoinColumn(name = "id"))

但是 Hibernate 说来自 tab_a 的列没有默认值(我会说这很奇怪)。

【问题讨论】:

  • 我会说将流派视为一个单独的事物绝对是有意义的。否则,您将如何提出有关该类型的查询?你想要做的就是模式的非规范化——这是你需要一个很好的理由,我目前看不到。
  • 嗨,索伦西托。谢谢你的评论!你是对的,对它进行非规范化是不明智的,因为我最终会在数据库级别和内存中得到重复项。为流派声明一个单独的实体可能是有意义的,但是,只有一个名称(一个 Strimg),这似乎有点傻......
  • 绝对不傻 - 有 2 列的表格可能非常有意义。选择一个好的索引,你会做出相当快的查询!
  • 顺便说一句:也使用 id 作为外键,而不是名称。这将增加未来变化的安全性。将您的类型视为“主数据”表:-)

标签: hibernate enums


【解决方案1】:

这是我解决这个问题的方法(以防其他人需要此信息):

注释几乎相同,因此您可以查看原始问题(标签的@Column 表示来自 tab_resource_tags 的列,而不是 tab_a 和 @JoinColumn 属于同一个 tab_resource_tags)。可以在这里仔细查看:http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection

问题出在数据库表上:

db 中的 tab_a 表没有什么特别之处。重要的部分是tab_resource_tags:

CREATE TABLE `tab_resource_tags` (
    `resource_descriptor_id` int(11) NOT NULL,
    `tag_name` varchar(255) NOT NULL
)
  • 请注意这里缺少主键(这是我的错误)。

所以现在,每次我添加一个包含一组类型为 Genre 的枚举的实体时,它们都会进入标签表,有效地模拟多对多关系(仅使用枚举而不是真正的类)。

希望这说明清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多