我正在尝试将@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。
我已经尝试了以下方法:
到目前为止,我找到的两种解决方案是要么使用数据库触发器,要么在更新实体并手动设置创建日期之前从数据库中手动检索实体(这里也提到)。是否有其他选项,或者配置错误?这是预期的行为吗?
创建数据。(完全更新
意味着使用现有id创建新实例)
部分更新(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和定义下面的