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

如何在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

我有一个实体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;

------
}
但是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
)
  • 注意这里缺少主键(这是我的错误)
所以现在,每次我添加一个包含一组类型为Genre的enum的实体时,它们都会进入tags表,有效地模拟多对多关系(仅与enum而非实际类)


希望这能说明问题。

我想说,将这些流派作为一个单独的东西来考虑是绝对有意义的。否则,您将如何表述有关该类型的查询?你想做的是称为模式的非规范化——这是你需要的一个很好的理由,我现在看不到。嗨,sorencito。谢谢你的评论!你是对的,对它进行非规范化是不明智的,因为我最终会在DB级别和内存中产生重复项。为体裁声明一个单独的实体可能是有意义的,但是,只有一个名称(Strimg),这似乎有点愚蠢…绝对不愚蠢-具有2列的表可能完全有意义。选择一个好的索引,您将进行非常快速的查询!顺便说一句:还可以使用id作为外键,而不是名称。这将提高未来变化的安全性。把你的体裁看作“主数据”表:
CREATE TABLE `tab_resource_tags` (
    `resource_descriptor_id` int(11) NOT NULL,
    `tag_name` varchar(255) NOT NULL
)