枚举类型的默认实体

3

我有一个枚举类型的属性:

@Basic
@Column(name = "payment_status", columnDefinition = "varchar(32) default 'ENTERED'", nullable = false)
@Enumerated(EnumType.STRING)
private PaymentStatus paymentStatus;

我想从枚举中获取字段的默认值。

我遇到了错误:

org.hibernate.PropertyValueException: not-null property references a null or transient value 

该字段不能为空

当我想要创建一个对象并将其保存在数据库中时,如果没有输入此字段(PaymentStatus),就会出现错误。

编辑:

@Basic
@ColumnDefault(value = "ENTERED")
@Column(name = "payment_status", nullable = false)
@Enumerated(EnumType.STRING)
private PaymentStatus paymentStatus = PaymentStatus.ENTERED;

为什么它不能工作?

private PaymentStatus paymentStatus = PaymentStatus.ENTERED; - Andreas
@Andreas 我知道这个解决方案,但我必须使用注释。我已经被强制执行了。 - DeveloperApps
为什么必须使用注释?这似乎是一个任意的限制。通过使用初始化器,该字段将立即具有默认值,因此如果您创建一个新对象(使用 new ),并且您的代码调用 getPaymentStatus(),则代码将获取默认值,而不是 null 值,这正是您想要的。 - Andreas
@Andreas,我在问题中添加了EDIT。你能谈一下它吗? - DeveloperApps
@ColumnDefault(value = "ENTERED")columnDefinition = "... default 'ENTERED'"相同,即它适用于DDL,因此仅适用于数据库。 - Andreas
2个回答

2

default 'ENTERED'表示如果在INSERT语句中没有包含该列,则数据库将使用值'ENTERED'。由于该列在类中,JPA将始终在INSERT语句中包含它。

要使JPA填充默认值,只需使用初始化程序为其分配该值,直到您替换它(调用setter方法)或从数据库中替换它(从那里读取)。

private PaymentStatus paymentStatus = PaymentStatus.ENTERED;

我应该保留现有的内容并添加 private PaymentStatus paymentStatus = PaymentStatus.ENTERED; 吗? - DeveloperApps
@DevNet 当然可以。如果记录是通过JPA代码以外的其他方式插入的,您希望具有相同的默认值。 - Andreas

0
如果您在数据库中定义了默认值,并且希望将其留给数据库来设置默认值,则需要在SQL插入语句中防止将null插入到该列中。
然后,您需要查看JPA提供程序在该领域提供的内容。例如,在Hibernate中,您只需使用@DynamicInsert注释对实体进行注释即可:

https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/annotations/DynamicInsert.html

关于插入操作,这个实体应该使用动态SQL生成吗?只有非空列在准备好的SQL语句中被引用。
需要注意的是,在JPA注释中定义默认值(就像你所做的那样)只对DDL生成有影响,也就是说,如果你让JPA提供程序生成或更新模式,则不会对任何插入或更新操作产生影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接