web-dev-qa-db-ja.com

oneToMany関係を持つSpringBoot Rest APIPostメソッド

私は春が初めてで、最初のWebアプリを作成しています。アイテムとユーザーエンティティがあります。ユーザーはたくさんのアイテムを持つことができます。したがって、ユーザーはアイテムのリストを持っています

@Entity
@Table(name = "user")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = true)
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank
    private String name;

    private String img;

    @NotBlank
    @Column(unique = true)
    private String email;

    @JsonBackReference
    @Fetch(FetchMode.JOIN)
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Item> items;

// getters and setters

}

これが私のItemエンティティです

@Entity
@Table(name = "item")
@EntityListeners(AuditingEntityListener.class)
public class Item implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @JsonIgnore
    @JsonManagedReference
    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
   // setters and getters
}

アイテムを作成するためのRESTコントローラーも作成し、このようにPOSTエンドポイントを定義しました

@PostMapping("/item")
    public Item createNote(@Valid @RequestBody Item item) {
        return itemRepository.save(item);
    }

ここで私が郵便配達員を使って要求を送る方法 enter image description here

では、このアイテムオブジェクトをその関係でどのように保存する必要がありますか?何か案は?

5
David

アイテムを保存した瞬間に、参照であるユーザーがデータベースに存在しないため、このエラーが発生します。あなたがしなければならないことは、あなたがあなたのアプリケーションをどのように振る舞わせたいかによります。

アイテムを保存する前にユーザーが存在する必要がある場合は、名前または電子メールでユーザーをロードし、アイテムでユーザーを参照してから、アイテムを保存する必要があります。

アイテムの作成中にユーザーを作成する場合は、ユーザークラスのアイテムの場合と同じように、アイテム内のユーザーをカスケードできます。したがって、アイテムを永続化するときにユーザーを永続化する場合は、CascadeType.PERSISTを試してください。

@ManyToOne(cascade = CascadeType.PERSIST)
private User user;

ただし、アイテムの作成中にユーザーを作成する場合でも、ユーザーが既に存在するかどうかを事前に確認し、最終的にユーザーをロードする必要があります。

そう、

  1. カスケード
  2. ユーザー名またはメールでユーザーを読み込む
  3. 存在する場合、またはそのままにしておく場合は、アイテム内の参照
  4. アイテムを保存
2
Michael Seiler

アイテムを保存する前にユーザーを保存する必要があります

item.setUser(userRepository.save(item.getUser));
return itemRepository.save(item);