【问题标题】:Persisting EnumSet in Postgresql with Hibernate使用 Hibernate 在 Postgresql 中持久化 EnumSet
【发布时间】:2015-05-06 22:19:56
【问题描述】:

Effective Java,第 32 项,声明使用 EnumSet 而不是位字段。我还在该主题上找到了this nice tutorial。这本书已经有一段时间了,为什么我没有找到任何关于如何使用 Hibernate 持久化 EnumSet? 的帖子?好吧,我实际上找到了 this oneanother one,但他们两者都很老,指向相同且更老的解决方案,不幸的是,这对我没有帮助,也许是因为我缺乏更深入的休眠知识?这是我的代码摘要:

public class MyThing {
    public enum MyOptions {
        FLAG1, FLAG2
    }

    @Id
    private Long id;

    @Column(name = "options")
    private EnumSet<MyOptions> options;

    // [other fields, getters, setters etc]
}

我尝试过其他注释,例如

@ElementCollection

有和没有(targetClass = MyOptions.class)

@JoinTable(name = "my_options",
    joinColumns = @JoinColumn(name = "id"))

还有

@OneToMany
@JoinColumn(name = "options")

但没有运气。

最好将信息存储在my_thing 表的新列中,但如果需要,我也可以使用单独的枚举表。

【问题讨论】:

    标签: java hibernate postgresql enums enumset


    【解决方案1】:

    试试这个

    @ElementCollection
    @CollectionTable(name = "my_options", 
            joinColumns = @JoinColumn( name = "mything_id"))
    @Column(name = "option")
    @Enumerated(EnumType.STRING)
    private Set<MyOptions> options;
    

    使用此配置,您需要一个名为my_options 的数据库表,其中包含optionmything_id 列,它们以MyThing 表为目标。

    【讨论】:

    • 我想补充一点,当我声明 @Enumerated(EnumType.STRING) private EnumSet&lt;MyOptions&gt; regions; 我得到 org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: 所以我必须修改我的 getter 以通过这样做安全地获取 EnumSet 的实例:public EnumSet&lt;Region&gt; getRegions() { ` return EnumSet.copyOf(regions);` }`
    猜你喜欢
    • 2011-05-12
    • 2012-07-02
    • 2010-09-24
    • 2012-02-16
    • 2013-01-27
    • 2013-11-12
    • 2023-03-19
    • 2014-12-14
    相关资源
    最近更新 更多