当前位置: 首页 > 面试题库 >

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

麹培
2023-03-14
问题内容

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

但是,当我们将实体保存到数据库时,此字段的值为null和。对于布尔字段- 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

我们做错了什么?为什么它仅适用于布尔值?


问题答案:

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

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因为布尔字段的默认值为false。



 类似资料:
  • 我试图在Avro模式中创建Union字段,并用它发送相应的JSON消息,但要有一个字段-。 https://avro.apache.org/docs/1.8.2/spec.html#工会 具有相应JSON数据的最简单联合类型(avro模式)的示例是什么?(尝试制作不含NULL/空数据的示例和含NULL/空数据的示例)。

  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案:

  • 问题内容: 我问这个问题有点傻,但是我找不到这个问题的简单答案。 以这个简单的实体为例: 它代表一个人,因此我想添加一个“ 性别 ”属性。 这将是“男性”或“女性”。所以呢? 我可以使用String,并要记住,“ m”代表男性,“ f”代表女性。 或者,我可以使用布尔值“ isMale”(是或否)。 但是,我认为无论哪种情况,Hibernate纯粹主义者都不会高兴:) 仔细搜索一下,我发现最佳实践

  • 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。 数字枚举 首先我们看看数字枚举,如果你使用过其它编程语言应该会很熟悉。 enum Direction { Up = 1, Down, Left, Right } 如上,我们定义了一个数字枚举,Up使用初始化为1。 其余的成员