0

我有一个包含一组标签的实体 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;

------
}

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

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

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

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

后期编辑:

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

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

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

4

1 回答 1

1

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

注释几乎相同,因此您可以查看原始问题(标签的@Column 表示来自 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 的 Enum 的实体时,它们都会进入标签表,有效地模拟多对多关系(仅使用 Enums 而不是真正的类)。

希望这可以说清楚。

于 2013-01-06T17:57:53.533 回答