具有oneToMany关系的Spring Boot Rest API Post方法

Dav*_*vid 3 java spring jpa one-to-many

我是春季新手,并且正在构建我的第一个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

}
Run Code Online (Sandbox Code Playgroud)

这是我的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
}
Run Code Online (Sandbox Code Playgroud)

我还创建了rest控制器来创建Item,并定义了这样的POST端点

@PostMapping("/item")
    public Item createNote(@Valid @RequestBody Item item) {
        return itemRepository.save(item);
    }
Run Code Online (Sandbox Code Playgroud)

这是我如何使用邮递员发送请求 在此处输入图片说明

那么,我如何需要以这种关系保存该项目对象?有任何想法吗?

小智 5

之所以会出现此错误,是因为保存项目的那一刻,数据库中就没有引用的用户。您必须执行的操作取决于您希望应用程序如何运行。

如果在保存项目之前该用户必须存在,则应通过其名称或电子邮件来加载该用户,在该项目中对其进行引用,然后保存该项目。

如果要在创建项目时创建用户,则可以像处理用户类中的项目一样将用户级联到项目中。因此,如果要在保留项目时保留用户,请尝试CascadeType.PERSIST

@ManyToOne(cascade = CascadeType.PERSIST)
private User user;
Run Code Online (Sandbox Code Playgroud)

但是,即使您要在创建项目时创建用户,也应事先检查该用户是否已存在并最终加载该用户。

所以,

  1. 级联
  2. 通过用户名或电子邮件加载用户
  3. 在项目中引用(如果存在)或离开(如未找到)
  4. 保存物品