如何使用Spring Data REST更新@ManyToOne关系?

8

我使用Spring Data REST和JPA。我有一个用户实体,它与另一个名为AccountStatus的实体有一个多对一的关系,并在单独的RDBMS表中建模。JSON表示形式如下:

{
   "id": "123"
   "username": "user1",
   "accountStatus": {
     "id": "1",
     "status": "Active"
   }
}

用户实体中的关系为:
@ManyToOne(optional = false)
@JoinColumn(name = "account_state")
@Getter @Setter private AccountState accountState;

现在我尝试使用 /users/123 上的 PATCH 请求以及以下有效负载来更改帐户状态:
{"accountState":{"id":0}}

但是我遇到了一个错误:

 "identifier of an instance of com.domain.account.AccountState was
  altered from 1 to 0; nested exception is org.hibernate.HibernateException:
  identifier of an instance of com.domain.account.AccountState was
 altered from 1 to 0"

我也尝试使用@HandleBeforeSave/@HandleBeforeLinkSave从存储库中获取新的AccountState,并将user.accountStatus替换为新状态,但没有成功。

我做错了什么?


@Makoto,我认为另一个问题是关于更改拥有实体的PK,我的问题是关于更改User和AccountState之间没有级联定义的子关系。 - florind
1个回答

11

这要看你是否有一个导出的AccountState代码库。如果有,你可以使用PATCH方法对/users/{id}进行账户状态更新:

{
    "accountState": "http://localhost:8080/accountStates/2"
}

所以你正在使用你的账户状态的URI来引用要分配的资源。


嘿,马蒂亚斯,我遇到了同样的问题,但由于各种原因,我们实例中的“accountState”未被导出。有没有一种方法可以在不导出它的情况下完成? - pasquers
@pasquers 我不这么认为 - 我认为您需要为更新创建一个自定义控制器,并将其链接到您拥有的资源。 - Mathias Dpunkt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接