java - 如何持久化 EnumSet(使用两个数据库表)?

标签 java hibernate jpa enums persistence

我想在我的实体中将一组选项表示为 EnumSet,并在我的数据库中表示为一对多关系。这是如何正确完成的?我只能找到旧的(预注释)答案或不使用两个表的答案。

我定义了以下表格:

CREATE TABLE Users (
    id                      SERIAL PRIMARY KEY,
    name                    VARCHAR(255) NOT NULL UNIQUE
);

CREATE TABLE User_Options (
    user_id                 INT,
    user_option             VARCHAR(255),
    PRIMARY KEY (user_id, user_option),
    FOREIGN KEY (user_id) REFERENCES Users(id)
                ON DELETE CASCADE
                ON UPDATE CASCADE
);

这个实体类:

@Entity(name = "Users")
public final class User {

    @Id
    @GeneratedValue
    private int id;

    @Column(nullable = false, unique = true)
    private String name;

    private final Set<UserOption> options;

    {
        this.options = EnumSet.noneOf(UserOption.class);
    }

    /* plain getter for id included */

    /* plain getter and setter for name included */

    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "User_Options"
            , joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "user_option", nullable = false)
    public Set<UserOption> getOptions() {
        return this.options;
    }

}

当然还有枚举:

public enum UserOption {

    OPTION_A,
    OPTION_B,
    OPTION_C;

}

当我启动 Tomcat 时,出现以下异常:

org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: Users, for columns: [org.hibernate.mapping.Column(options)]

这个异常是一堆异常相互引发的根源。它会导致 javax.persistence.PersistenceException(无法构建 EntityManagerFactory),进而导致一些依赖项注入(inject)异常。

我承认我对 JPA/Hibernate 不够精通,无法理解我做错了什么。谁能帮帮我?

最佳答案

事实证明,答案比我想象的要简单。您不能在实例变量和 getter 上混合使用 JPA 注释。注释本身很好。我按如下方式更改了我的实体类,现在一切正常。

@Entity(name = "Users")
public final class User {

    @Id
    @GeneratedValue
    private int id;

    @Column(nullable = false, unique = true)
    private String name;

    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "User_Options"
            , joinColumns = @JoinColumn(name = "user_id"))
    @Column(name = "user_option", nullable = false)
    private final Set<UserOption> options;

    {
        this.options = EnumSet.noneOf(UserOption.class);
    }

    /* plain getter for id included */

    /* plain getter and setter for name included */

    public Set<UserOption> getOptions() {
        return this.options;
    }

}

关于java - 如何持久化 EnumSet(使用两个数据库表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14821734/

相关文章:

java - hibernate - 无法执行语句; SQL [不适用] - 保存嵌套对象

java - 如果我删除了一个不管理此关联的实体,是否有办法让 Hibernate 处理删除 @ManyToMany 关联中的条目?

java - HQL不提取空字段的结果

java - 每天更新随机字符串

java - 用 Class.forName() 初始化一个类,它有一个带参数的构造函数

java - Hibernate 在插入/更新 blob 时使用两倍文件大小的查询

java - 将条目映射到 Hibernate 中的单独列

postgresql - Spring Boot 无法创建数据库模式

java - 在 Spring Data 中更新

java - 在 Android 中使用 Exception 使应用程序崩溃