私は春が初めてで、最初の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);
}
では、このアイテムオブジェクトをその関係でどのように保存する必要がありますか?何か案は?
アイテムを保存した瞬間に、参照であるユーザーがデータベースに存在しないため、このエラーが発生します。あなたがしなければならないことは、あなたがあなたのアプリケーションをどのように振る舞わせたいかによります。
アイテムを保存する前にユーザーが存在する必要がある場合は、名前または電子メールでユーザーをロードし、アイテムでユーザーを参照してから、アイテムを保存する必要があります。
アイテムの作成中にユーザーを作成する場合は、ユーザークラスのアイテムの場合と同じように、アイテム内のユーザーをカスケードできます。したがって、アイテムを永続化するときにユーザーを永続化する場合は、CascadeType.PERSIST
を試してください。
@ManyToOne(cascade = CascadeType.PERSIST)
private User user;
ただし、アイテムの作成中にユーザーを作成する場合でも、ユーザーが既に存在するかどうかを事前に確認し、最終的にユーザーをロードする必要があります。
そう、
アイテムを保存する前にユーザーを保存する必要があります
item.setUser(userRepository.save(item.getUser));
return itemRepository.save(item);