2016-01-12 17 views
6

Używam Spring Data REST z JPA. Mam jednostkę użytkownika, która ma wiele do jednego relacji z innym o nazwie AccountStatus modelowanym w oddzielnej tabeli RDBMS. Reprezentacja JSON wygląda następująco:Jak zaktualizować relację @ManyToOne z usługą Spring Data REST?

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

Relacje w jednostce użytkownik to:

@ManyToOne(optional = false) 
@JoinColumn(name = "account_state") 
@Getter @Setter private AccountState accountState; 

Teraz staram się zmienić stan konta za pomocą żądania plaster na/Użytkownicy/123 i ładowności:

{"accountState":{"id":0}} 

ale pojawia się błąd:

"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" 

Próbowałem również użyć @ HandleBeforeSave/@ HandleBeforeLinkSave, aby pobrać nowe konto Account z repozytorium i zastąpić user.accountStatus bez powodzenia.

Co robię źle?

+0

Możliwa duplikat [Hibernate: Jak naprawić "identyfikator instancji zmienionej z X na Y"?] (http://stackoverflow.com/questions/4179166/hibernate-how-to-fix-identifier-of-an-instance-altered-from-x-to- y) – Makoto

+0

@Makoto, myślę, że inne pytanie dotyczy zmiany PK podmiotu będącego właścicielem, mój problem dotyczy zmiany relacji podrzędnej, w której nie zdefiniowano kaskadowania między użytkownikiem a stanem konta. – florind

Odpowiedz

8

To naprawdę zależy, czy masz wyeksportowane repozytorium dla AccountState. Jeśli nie możesz zaktualizować swój stan konta z PATCH przeciwko /users/{id}:

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

Więc używasz URI swojego stanu konta, aby odwoływać się do zasobów przypisać

+0

Hej, Mathias, mam ten sam problem, ale z różnych powodów "accountState" w naszym wystąpieniu nie jest eksportowane. Czy istnieje sposób, aby to zrobić bez eksportowania? – pasquers

+0

@pasquers Nie sądzę - myślę, że musiałbyś stworzyć niestandardowy kontroler aktualizacji i dodać link do tego do swojego zasobu –

+0

Czy ktoś może wyjaśnić, dlaczego nie działa z PUT? – Toilal