当前位置: 首页 > 知识库问答 >
问题:

@CreatedDate在更新时设置为null(spring数据jdbc)[重复]

孙佐
2023-03-14

我正在尝试将@CreatedDate与spring-data-jdbc和PostgreSQL数据库结合使用,以跟踪首次创建表条目的时间。当插入新行时,这有效(它正确地将其设置为当前日期),但是在更新条目时,我得到异常,因为它被设置为null,这是我的配置不允许的。

这是我的实体(省略了其他不相关的字段):

@Table("my_entity")
public class MyEntity {

    @Id
    private final Long id;

    @Column("created_at")
    @CreatedDate
    private Instant createdAt;

    public MyEntity (Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public Instant getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Instant createdAt) {
        this.createdAt = createdAt;
    }
}

这是我的存储库:

public interface MyRepository extends CrudRepository<MyEntity, Long> {}

这是相关的配置:

@Configuration
@EnableJdbcRepositories("com.example")
@EnableJdbcAuditing
public class JdbcConfig extends AbstractJdbcConfiguration {
}

使用存储库。saveAll()方法,第一次正确设置了createdAt。当使用相同的方法更新现有实体时,当我希望跳过字段时,它将被设置为null。

我已经尝试了以下方法:

    < li >按照spring-data-rest的建议移除公共getters和setters(参见此处)-没有改变任何事情 < li >按照JPA的建议设置< code>@Column(name="created_at ",updatable="false")(参见此处)-此字段不适用于我正在使用的注释(< code > org . spring framework . data . relational . core . mapping . Column )

到目前为止,我找到的两种解决方案是要么使用数据库触发器,要么在更新实体并手动设置创建日期之前从数据库中手动检索实体(这里也提到)。是否有其他选项,或者配置错误?这是预期的行为吗?

共有1个答案

卫增
2023-03-14
  1. 在完全更新时手动设置创建数据。(完全更新意味着使用现有id创建新实例)
  2. 部分更新(Partial update意味着您将记录保存到持久性上下文中,例如使用findById,然后更新并保存回来)

当您启用@EnableXXXAudting时,它将确定您的repo.save()插入还是更新,然后分别更新您的@CreatedDate@LastModifiedDate

在您的情况下:未设置使用 createdAt 进行完全更新。Spring Data JDBC 将基于您的记录 ID 来确定是否应插入您的记录或更新实体状态检测策略。如果它看到 ID 存在,它将执行更新@EnableXXXAuditing更新的行为仅设置@LastModifiedDate因此创建的At仍为空。这就是你遇到麻烦的原因。

仅供参考:关于@EnableXXXAuditing的简短解释在这里

 类似资料:
  • 我使用的是Spring数据JDBC。 我有一个实体,其中的字段用

  • 我有一个Spring应用程序,其中Domain Object标识符不是由数据库分配的,而是由应用程序生成的。标识符是在BeforeSave回调期间生成并添加到Domain Object中的。保存域对象(插入)后,当尝试保存具有相同标识符的域对象(更新)时,我收到以下错误 原因:组织。springframework。道。Incorrectupdatesemanticdataaccessexcepti

  • 每当我的primaryGrpId为null时,以下本机查询就会因SQLGrammerException而失败,因为它需要数字。Andy知道如何在JPA中使用本机查询将参数值设置为NULL。数据库是ORACLE。 由以下原因引起:java.sql.SQLSynaxErrorException: ORA-00932:不一致的数据类型:预期的数字得到了二进制 我所有的DAO方法都只是声明的,没有提供任何

  • 在使用JPA更新用户时,如果我尝试使用 JPA首先尝试将关联订单上的userid设置为null,然后删除该行。这将失败,因为userid是不可为空的,并且是主键的一部分。有没有一种方法可以告诉JPA它只需要删除Order行,而不首先将userid列设置为null? 映射:我有的映射是这样的:

  • 我正在使用Spring-Boot 2.5.0和MongoDB来持久化一些文档。这里是Github项目。 对于每个文档,我还需要自动保存一些审计信息,因此我扩展了以下类: 例如。让我们考虑类: 我遇到的问题是,当我通过JSON更新文档时,我能够更改/覆盖CreatedBy和CreatedDate字段的值。 这意味着,如果未提供字段,则结果值将保存为null,否则,它将为创建者和创建的字段保存新值。

  • 我在spring data jdbc中使用简单的crud操作和审计。因此,当我插入新记录时,审计工作完全正常。但是当我更新我的记录时,我的createdby和createddate设置为null。有什么方法可以避免修改这些列吗? 注意:column(可更新= false)特性不支持spring data jdbc。 我的审计实体如下所示: 以及使用@EnableJdbcAuditing和定义下面的