我有一个实体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中的列没有默认值(我想说这很奇怪)。
我是这样解决这个问题的(以防有人需要这个信息):
注释几乎相同,因此您可以查看原始问题(标签的@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的enum的实体时,它们都会进入标签表,有效地模拟多对多关系(仅使用enum而不是真正的类)。