如何在hibernate对象中正确存储枚举数组?

时间:2013-01-05 19:32:27

标签: hibernate enums

我有一个实体A,其中包含一组标记,如下面的代码段所示:

@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;

------
}

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

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

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

任何与此相关的意见都将受到高度赞赏。

稍后编辑:

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

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

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

1 个答案:

答案 0 :(得分:1)

以下是我解决此问题的方法(如果其他人需要此信息):

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

问题在于数据库表:

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

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

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

希望这说清楚。