[英]How to update a referenced object with PATCH request in spring data-rest
我有 2 个连接的实体:项目和系统。 映射类似于 Project class 中的映射:
@ManyToOne
@JoinColumn(name = "system_id")
@NotNull
private System system;
我正在尝试使用 spring 数据休息来实现基本的 rest API 项目。 像 GET 或更新简单属性这样简单的东西效果很好。 但是这个查询会导致困难:
PATCH /api/projects/1 HTTP/1.1
{
"name": "Name2",
"system": {
"id": 1
}
}
我希望此查询更改名称并更改链接系统 object 并且找不到如何执行此操作的方法。 我了解,可以使用此处所述的额外查询更新链接: https://www.baeldung.com/spring-data-rest-relationships 。 但是我需要保留旧的 API 接口,所以我需要使该接口工作。 抛出的错误是:
Caused by: org.hibernate.HibernateException: identifier of an instance of com.company.resourceapi.entities.Project was altered from 3 to 1
更新。 澄清:在更新之前,项目是
id: 1,
name: "Name1",
system_id: 2
在 PATCH 请求后我想看看
id: 1,
name: "Name2",
system_id: 1
我想出了这个不太优雅的解决方案:我像这样覆盖存储库中的save
方法:
public class ProjectRepositoryImpl implements CustomSaveRepo<Project> {
@Autowired
private SystemRepository repository;
@Autowired
private EntityManager em;
@Transactional
@Override
public Project save(Project entity) {
// entity.system has the id from the request, in the same time it's managed entity.
if (entity.getSystem() != null) {
Long sysId = entity.getSystem().getId();
if (sysId != null) {
em.detach(entity.getSystem());
System system = repository.findById(sysId)
.orElseThrow(() -> new RuntimeException());
entity.setSystem(system );
}
}
entity.setUpdatedAt(new Date());
em.persist(entity);
return entity;
}
}
有人与我分享更好的解决方案将不胜感激。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.