SpringデータRESTとSpringデータJPAを使用して、集合ルート上の子エンティティコレクションを更新したいとします。デモの例として、Comment
エンティティと1対多の関係を持つPost
エンティティがあるとします。 Post
には独自のSpringデータリポジトリがあります。 Comment
は、Post
によってのみアクセスされるため、表示されません。SpringデータREST/JPA - 複合キーを使用したOneToManyコレクションの更新
Comment
には、既存のデータベース設計によるPost
への外部キーを含む複合キーがあります。その結果、双方向関係の必要がなくても、双方向関係なしで外部キーをComment
の複合キーの一部にする方法を見つけることができませんでした。
クラスはロンボク島の注釈で、次のようになります。
@Entity
@Data
public class Post {
@Id
@GeneratedValue
private long id;
@OneToMany(mappedBy = "post", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<Comment> comments = new HashSet<>();
private String title;
}
コメント:
@Entity
@IdClass(Comment.CommentPk.class)
@Data
@EqualsAndHashCode(exclude = "post")
@ToString(exclude = "post")
public class Comment {
@Id
private long id;
@Id
@ManyToOne(fetch = FetchType.LAZY)
@RestResource(exported = false)
@JsonIgnore
private Post post;
private String content;
@Data
static class CommentPk implements Serializable {
private long id;
private Post post;
}
}
とリポジトリ:
public interface PostRepository extends JpaRepository<Post, Long> {
}
私はPost
を作成しようComment
の場合、例外は発生します。POST_ID
はNULLにすることはできません。つまり、保持しようとしているComment
の親Post
へのバックリファレンスが欠落しています。
これは後方参照を保持Post
から@PrePersist
方法を追加することによって解決することができます。新しいPost
を作成するときに
@PrePersist
private void maintainParentBackreference() {
for (Comment comment : this.comments) {
comment.setPost(this);
}
}
以上が正常に動作しますが、Comment
を追加しようとすると、それは助けにはなりません既存のPost
(例えばPUT要求に)にコメントを挿入しようとすると、次のエラーが発生しますので:要約すると
NULL not allowed for column "POST_ID"; SQL statement:
insert into comment (content, id, post_id) values (?, ?, ?) [23502-193]
を、ステップREPROへデュースは以下のとおりです。
で作成したPost
私はComment
を追加/更新することができることを達成することができ、最も簡単な方法は何ですかComment
に無Comment
秒
- POST
Post
既存のPost
にSpring Data RESTを使用していますか?これを示すサンプルプロジェクトをここで見つけることができます:https://github.com/shakuzen/aggregate-child-update-sample/tree/composite-key
この特定の設定は、リポジトリの
composite-key
ブランチです。このコードで、上記の不具合を再現するには、統合テストAggregateCompositeKeyUpdateTests.canAddCommentWithPut
ありがとうございました。 Spring Data RESTに、対応するHTTPリクエストを処理する際にこれらのメソッドを簡単に使用できるかどうかを示唆してもらえれば幸いです。 –
アイデアをSpring Data RESTとリスナまたは注釈付きハンドラコールバックを使用して統合する方法についての情報を追加しました。 – Naros