ConstraintViolationException当试图在数据库设置默认值的列中插入包含空值的行时



我有一个表的列('requestLastUpdated'),不允许为空,但有一个默认值(getDate())由数据库定义。这个字段最初没有在Java实体中定义,因为当时代码不需要它。插入工作正常,数据库正确地将插入发生的时间设置为该字段。现在我正在向应用程序添加一些报告功能,并希望从数据库中读取此值,因此我将此字段添加到实体中。然而,现在当代码试图插入数据时,我得到:由于:org.hibernate.exception.ConstraintViolationException: could not execute statement…

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'requestLastUpdated', table 'dbo.myTable'; column does not allow nulls. INSERT fails.

是否有任何注释或任何我可以添加到我的实体来告诉Hibernate,它是可以尝试在数据库定义为非空的字段中持久化一个空值?

实体类:

@Entity
@Table(name = "RequestChild", schema = "dbo")
@Getter
@Setter
@NoArgsConstructor
@ToString
public class RequestChild implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "childRequestId", nullable = false)
private Long childRequestId;
@Column(name = "parentId", nullable = false, insertable = false, updatable = false)
private Long parentId;
@Column(name = "itemId")
private String itemId;
@Column(name = "createTime")
private String createTime; //This is the column that's not null in the database and things worked before it was added to this entity.

@Column(nullable = false)注释为表定义添加了一个非空约束,但是Hibernate或任何其他框架将不执行任何验证在实体属性上。Hibernate只执行SQL INSERT或UPDATE语句,数据库将验证约束。

因此,您可以在实体内部使用@Column(nullable = false)注释。它可以创建SQL插入或更新查询并将其传递给DB,而无需内部代码验证:

@Entity
public class YourClass {
...
@Column(nullable = false)
private Date requestLastUpdated;
...
}

最新更新