春季 JPA - 枚举中枚举字段的默认值

2022-09-03 17:21:10

我们有一个带有枚举字段的实体 - ,我们希望使用 JPA 注释 - 为其设置默认值 - 。emailCommunicationStatus'UNKNOWN'

但是,当我们将实体保存到 DB 时,此字段的值是 而不是 。对于布尔字段 - 保存正确的默认值 ()。nullisLockedfalse

@Entity
public class Account {

    @Id
    @GeneratedValue
    @Column(name = "id")
    protected Long id;

    @Column(columnDefinition = "boolean default false")
    private boolean isLocked;

    @Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'")
    @Enumerated(value = EnumType.STRING)
    private CommunicationStatus emailCommunicationStatus;

    PlayerAccount() {
        super();
    }
}

public enum CommunicationStatus {
    VALID,
    INVALID,
    DONT_CONTACT,
    UNKNOWN;
}

如果我们改用:for,我们在保存时会得到以下异常:@Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'")emailCommunicationStatus

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'emailCommunicationStatus' cannot be null

我们做错了什么?为什么它只使用布尔值?


答案 1

当某些 SQL 代码插入一行而不为 emailCommunicationStatus 列指定任何值时,您所做的操作非常有用。在这种情况下,该行将具有“未知”作为此列的值:

insert into account (id, isLocked) values(1, false)

但是Hibernate永远不会做这样的插入。它将始终传递此实体的字段的实际值。因此,如果将其保留为 null,它将在数据库中显式将其设置为 null:emailCommunicationStatus

insert into account (id, isLocked, emailCommunicationStatus) values(1, false, null)

您需要的是设置此字段的默认值:

@Column(length = 32, columnDefinition = "varchar(32) default 'UNKNOWN'")
@Enumerated(value = EnumType.STRING)
private CommunicationStatus emailCommunicationStatus = CommunicationStatus.UNKNOWN;

它工作正常,因为布尔字段的默认值为 false。isLocked


答案 2

只需初始化实体字段。休眠将使用已设置的值实例化实体类。当它刷新时,将使用指定的值插入该字段。

private CommunicationStatus emailCommunicationStatus = CommunicationStatus.UNKNOWN;

问候