gpt4 book ai didi

java - Spring JPA - 枚举中枚举字段的默认值

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:28 25 4
gpt4 key购买 nike

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

但是,当我们将实体保存到数据库时,该字段的值为 null 而不是 .对于 boolean 字段 - isLocked,保存了正确的默认值 (false)。

@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;
}

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

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

我们做错了什么?为什么它只适用于 boolean 值?

最佳答案

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

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

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

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;

它适用于 isLocked,因为 boolean 字段的默认值为 false。

关于java - Spring JPA - 枚举中枚举字段的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30707621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com