【问题标题】:In Spring Data JDBC bypass @CreatedDate and @LastModifiedDate在 Spring Data JDBC 中绕过 @CreatedDate 和 @LastModifiedDate
【发布时间】:2021-08-18 20:49:09
【问题描述】:

我正在使用Spring Data JDBC

我有一个实体,它的字段用@CreatedDate@LastModifiedDate 注释。

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

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

【问题讨论】:

  • 你检查过@PrePersist 和@PreUpdate 吗? baeldung.com/jpa-entity-lifecycle-events
  • @aksappy @Prepersist@PreUpdate 是 JPA 注释,对 Spring Data JDBC 实体没有影响。
  • @aksappy 如果可能的话,我也不想修改实体类。不幸的是,BeforeSaveEvent 没有帮助。

标签: java spring annotations spring-data spring-data-jdbc


【解决方案1】:

审计信息的填充由RelationalAuditingCallbackIsNewAwareAuditingHandler 完成。

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

您可以实现自己的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 中的逻辑占位符。在那里你应该插入你的方式来确定你是否手动设置值。也许您的实体实现了一个接口,该接口将该信息作为瞬态字段提供,或者您将该信息存储在线程局部变量中。

【讨论】:

    【解决方案2】:

    如果您在 Spring Boot 上使用上述解决方案,则可以。但在使用@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

    【讨论】:

      猜你喜欢
      • 2017-12-14
      • 1970-01-01
      • 2019-01-13
      • 2021-01-15
      • 2017-08-10
      • 1970-01-01
      • 2022-06-21
      • 2019-10-25
      • 2021-07-17
      相关资源
      最近更新 更多