如何在hibernate对象中正确存储枚举数组?
我有一个实体A,其中包含一组标记,如以下代码段所示:如何在hibernate对象中正确存储枚举数组?,hibernate,enums,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(n
@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;
------
}
但是Hibernate说tab_a中的列没有默认值(我认为这很奇怪) 以下是我解决这个问题的方法(以防其他人需要此信息):
注释基本相同,因此您可以查看原始问题(标记的@Column表示来自tab_resource_标记的列,而不是tab_a,@JoinColumn属于相同的tab_resource_标记)。可在此处仔细查看:
问题在于DB表:
DB中tab_a的表没有什么特别之处。重要的部分是选项卡\资源\标签:
CREATE TABLE `tab_resource_tags` (
`resource_descriptor_id` int(11) NOT NULL,
`tag_name` varchar(255) NOT NULL
)
- 注意这里缺少主键(这是我的错误)
希望这能说明问题。我想说,将这些流派作为一个单独的东西来考虑是绝对有意义的。否则,您将如何表述有关该类型的查询?你想做的是称为模式的非规范化——这是你需要的一个很好的理由,我现在看不到。嗨,sorencito。谢谢你的评论!你是对的,对它进行非规范化是不明智的,因为我最终会在DB级别和内存中产生重复项。为体裁声明一个单独的实体可能是有意义的,但是,只有一个名称(Strimg),这似乎有点愚蠢…绝对不愚蠢-具有2列的表可能完全有意义。选择一个好的索引,您将进行非常快速的查询!顺便说一句:还可以使用id作为外键,而不是名称。这将提高未来变化的安全性。把你的体裁看作“主数据”表:
CREATE TABLE `tab_resource_tags` (
`resource_descriptor_id` int(11) NOT NULL,
`tag_name` varchar(255) NOT NULL
)