親を更新しようとしたときにEntityExistExceptionが発生し、子がDTOです。これを修正するにはどうすればいいですか?親にマージを呼び出そうとしましたが、運がありません。私はSpringデータjpaと休止状態を使用しています。Spring Data/hibernate子DTOオブジェクトと@MapsIdの更新
私は次のことをやっている私のRESTサービスで@Entity
class Parent {
@Id
private int id;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "parent")
private Child child;
// getters and setters
}
@Entity
class Child {
@Id
private int id;
private String data;
@MapsId
@OneToOne
private Parent parent;
// getters and setters
}
:
Child child = new Child(data); // data from request
Parent parent = parentRepositoryService.getParent(id);
parent.setChild(child);
parentRepositoryService.update(parent);
parentRepositoryService.class
class ParentRepositoryService {
public void update(Parent parent) {
parent.getChild().setParent(parent); // necessary to prevent Exception
parentRepository.save(parent);
}
}
私はこの問題は、子オブジェクトからのセッションですでにあるということだと思います"parentRepositoryService.getParent(id)"コール。次に、Childオブジェクトがセッション外で作成され、古いChildオブジェクトと新しいChildオブジェクトの不一致が発生します。私は、手動でセッションベースのChildオブジェクトをリクエストデータから更新する必要がなく、Childエンティティに対してmysql "insert ... duplicate key update"と同等の機能を実行したいと考えています。
あなたは子供C1
を持つ親P
をロード:私はここだと思う
の一部である必要がありますか? oldChild.setParent(null)を呼び出そうとしましたが、まだ例外があります。 "EntityExistsException:同じ識別子値を持つ別のオブジェクトが既にセッションに関連付けられていました" – rodney757
C1とC2が同じPK(Parent.id)を使用しているが、異なるオブジェクトであるため、これが起こっていると思います。 – rodney757
はい、おそらく、親と子の間で共有されているPKのためです。 1つの解決策は、残りの要求に応答して既存の子を更新することである。 –