【发布时间】: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 作为外键,而不是名称。这将增加未来变化的安全性。将您的类型视为“主数据”表:-)