【发布时间】:2017-06-20 18:07:45
【问题描述】:
我正在使用带有 JPA/Hibernate 的 SpringBoot,我想添加审计。
我创建了一个具有以下内容的抽象实体:
@CreatedDate
@NotNull
@Column(columnDefinition = "DATETIME(3)", updatable = false)
private ZonedDateTime createdDate;
@LastModifiedDate
@Column(columnDefinition = "DATETIME(3)")
private ZonedDateTime lastModifiedDate;
应用程序
我正在开发一个带有简单 CRUD 实体的 RESTful API。 我的资源(控制器)正在使用 jpa 存储库上的 save() 方法进行创建和更新
问题:
当我在实体上调用 repository.save() 来更新它时,“createdDate”被忽略(这是正常的),但该方法返回的实体将其“createdDate”设置为 null。
然后将实体放入缓存中,下一次获取的 createdDate 值也会为 null。
如何在不允许修改字段 createdDate 和使用 JpaCrudRepository 的情况下更新实体?
更新
存储库定义:
public interface ModelRepository extends JpaRepository<Model, Long> {
REST 控制器:
public ResponseEntity<Model> createModel(@RequestBody Model model) throws URISyntaxException {
Model result = modelRepository.save(model);
return ResponseEntity.created(new URI("/api/v1/models/" + result.getId()))
.body(result);
}
端点返回的Json包含“createdDate: null”
更新 2
为了解决这个问题,我创建了这样的服务:
@Override
public Model save(Model model) {
Model result = modelRepository.save(model);
return result;
}
@Override
public Model update(Long id, Model model) {
Model existingModel = modelRepository.findOne(id);
if (existingModel == null) {
return null;
}
// Non updatable fields
model.setId(id);
model.setCreatedDate(existingModel.getCreatedDate());
Model result = modelRepository.save(model);
return result;
}
为了完成这项工作,我还从 createdDate 字段中删除了“updatable = false”,以防止结果在保存后出现空日期。
如果我们之后必须手动处理,我不明白设置“updatable = false”的目的。
【问题讨论】:
-
能否显示保存实体的代码?
标签: hibernate jpa spring-boot