在Spring数据JDBC中绕过@CreatedDate和@LastModifiedDate

In Spring Data JDBC bypass @CreatedDate and @LastModifiedDate

我正在使用 Spring Data JDBC

我有一个实体,其字段带有 @CreatedDate and @LastModifiedDate 注释。

但是,在某些情况下我想手动设置这两个字段。

有没有办法在某些情况下绕过 @CreatedDate@LastModifiedDate 而无需从实体中删除注释?或者我可以在保存实体之前添加回调吗?

填充审核信息由 RelationalAuditingCallback and IsNewAwareAuditingHandler 完成。

第一个基本上是模块特定部分的适配器(Spring 在这种情况下是数据关系),而第二个修改实体。

您可以实现自己的 IsNewAwareAuditingHandler 变体,将其填充到 RelationalAuditingCallback 中并将其注册为 bean。我不久前在 this project on GitHub:

做了类似的事情
@Bean
RelationalAuditingCallback isNewAwareAuditingHandler(JdbcMappingContext context) {
    return new RelationalAuditingCallback(new CustomAuditingHandler(context));
}

private static class CustomAuditingHandler extends IsNewAwareAuditingHandler {

    public CustomAuditingHandler(JdbcMappingContext context) {
        super(PersistentEntities.of(context));
    }

    @Override
    public Object markAudited(Object source) {

        if (!(source instanceof Product)) {
            return source;
        }

        Product product = (Product) source;
        if (product.createdDate == null) {
            product.createdDate = Instant.now();
        }

        return source;
    }
}

请考虑 CustomAuditingHandler 占位符中的逻辑。在那里你应该插入你的方式来确定你是否手动设置值。也许您的实体实现了一个接口,该接口将该信息作为瞬态字段提供,或者您将该信息存储在线程局部变量中。

如果您在 spring 启动时使用上述解决方案,就可以了。但在使用 @EnableJdbcAuditing 时,您应该删除 @EnableJdbcAuditing。 如果它使用它,RelationalAuditionCallback 在 ApplicationContext 上重复。

这是一个基于@Jens Schauder 想法的测试。 https://github.com/yangwansu/try-spring-data-jdbc/blob/main/src/test/java/masil/example/springdata/jdbc/ch9_14_1/ManuallySetupTest.java