簡體   English   中英

如何使用 spring data-rest 中的 PATCH 請求更新引用的 object

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM