在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
我正在使用 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