【问题标题】:Created by , Updated by column cannot be null spring jpa error创建者,更新者列不能为空 spring jpa 错误
【发布时间】:2019-11-22 07:47:17
【问题描述】:

我正在使用 spring boot 和 jpa,我想将数据保存在表中。 我在createdByupdatedByupdationDatecreatingDate 列上的数据库表约束不为空。

我有与实体类似的 DTO,上述审计字段不在 DTO 中,而仅在实体中,因此意味着用户不发送审计信息。

在我使用这个@EntityListeners(AuditingEntityListener.class)的实体上。

Problem is 当我尝试通过rep.save(entity) 更新实体时,我收到此错误"Column 'CreatedBy' cannot be null

我的实体正在使用审计实体侦听器,它看起来与此类似

    @Column(name = "isactive")
    private boolean active;
    @CreatedBy
    @Column(name = "createdby")
    private String createdBy;
    @CreatedDate
    @Column(name = "creationdate")
    private Instant creationDate;
    @LastModifiedBy
    @Column(name = "lastupdateby")
    private String lastUpdateBy;
    @LastModifiedDate
    @Column(name = "lastupdatedate")
    private Instant lastUpdateDate;

注意:如果我尝试创建新对象,它会被保存并正常工作,并且数据库中的审计信息(如由更新者创建的)也使用审计实体侦听器填充。 但是当它尝试更新同一个对象时,我得到createdBy不能为空的错误,我假设这些审计字段createdByupdatedBy ....也应该以同样的方式填充auditEntityListener我通过发布请求创建它。

【问题讨论】:

  • 添加名为 @Nullable 的注解,或 @Column 属性 nullable=true
  • 我认为这里的问题是它不应该为空@SwaritAgarwal
  • @SimasJoneliunas 我猜错误状态“列'CreatedBy'不能为空。如果它可以为空,那么问题应该纠正
  • 看起来您正在将createdBy 设置为null。不要那样做。
  • 如果应用程序允许来宾用户创建内容,那将是正确的。但是,大多数情况下,您不希望数据库中存在孤立对象,因此在这种情况下,这可能是错误配置的主体中的错误,或者是允许 created by 为空的设计错误。

标签: java spring hibernate spring-data-jpa hibernate-mapping


【解决方案1】:

您可以使用 updatable = false 标志,例如

@Column(name = "createdby", updatable = false)

@Column(name = "creationdate", updatable = false)

这帮助我解决了这个问题。

【讨论】:

    【解决方案2】:

    看看如何在link中使用Audit Aware

    【讨论】:

      【解决方案3】:

      我得到了解决方案,当我们需要更新正在使用 AuditEntityListener 的实体时 与 DTO 相比,我只更新了实体中更改的字段。 MapStruct 让一切变得简单

      void updateEntity(@MappingTarget Entity target, DTO dto); 现在保存更新的实体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 2017-05-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 2012-04-18
        相关资源
        最近更新 更多