带有CreationTimestamp的date字段抛出PropertyValueException:非null属性引用了null或瞬态值

时间:2019-01-23 16:18:06

标签: java hibernate spring-boot querydsl hibernate-jpa

我在spring-boot 2.0.6和hibernate 5.2.17中使用Web服务。当我使用@ CreationTimestamp,@ Column(nullable = false)和@Temporal(TemporalType.TIMESTAMP)的createTime字段保存对象时,出现异常org.hibernate.PropertyValueException:not-null属性引用了null或瞬态值: com.ex.Entity.createTime。但是在另一个服务(spring-boot 1.5.6和hibernate 5.0.12)中,没有发生此问题。

所以我通过调试逐步调试了它,最后发现当休眠状态使用@Column(nullable = false)

检查该字段时,
org.hibernate.engine.internal.Nullability#checkNullability(Object[] values, EntityPersister persister, boolean isUpdate)

变量Nullability#checkNullability在高版本中为true,而低版本为false。

@Table(name = "t_entity")
@Entity
class Entity{
  @Id
  @GenericGenerator(name = "system-uuid", strategy = "uuid")
  @GeneratedValue(generator = "system-uuid")
  @BeanProperty
  var id: String = _

  @CreationTimestamp
  @Temporal(TemporalType.TIMESTAMP)
  @Column(nullable = false, updatable = false)
  @BeanProperty
  var createTime: Date = _

  //other fields are ignored
}


trait EntityRepository extends JpaRepository[Entity, String] 
  with QuerydslPredicateExecutor[Entity] {
}

我知道更改版本(不能)或设置createTime的值(愚蠢)可以解决此问题,并且我认为java和scala对此问题影响很小,因此示例代码为scala。 有没有像注解一样更好的解决方法?

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题,当我添加时它会有所帮助 testImplementation("org.springframework.boot:spring-boot-starter-web")依赖我的项目。您可能希望它在测试或编译范围内。