java - 具有oneToMany关系的Spring boot rest api post方法

标签 java spring jpa one-to-many

我是 spring 的新手,正在构建我的第一个 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 Controller 来创建 Item 并像这样定义了 POST 端点
@PostMapping("/item")
    public Item createNote(@Valid @RequestBody Item item) {
        return itemRepository.save(item);
    }

在这里我如何使用 postman 发送请求
enter image description here

那么我需要如何用这种关系保存这个项目对象呢?有任何想法吗?

最佳答案

您收到此错误是因为在您保存项目时数据库中不存在引用的用户。您必须执行的操作取决于您希望应用程序的行为方式。

如果在您保存项目之前用户必须存在,您应该通过他的姓名或电子邮件加载用户,在项目中引用他,然后保存项目。

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

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

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

所以,
  • 级联
  • 通过用户名或电子邮件加载用户
  • 项目中的引用(如果存在)或离开(如果没有找到)
  • 保存项目
  • 关于java - 具有oneToMany关系的Spring boot rest api post方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48937513/

    相关文章:

    java - 如何在匿名内部类中使用外部变量

    java - 返回 boolean 值数组时出现奇怪的结果

    spring - javax.servlet.jsp.JspTagException : No message found under code 'errors.contact.sysadmin.msg' for locale 'en_US' .]

    java - 使用映射的 JPA 集合

    java - 使用 CrudRepository 的自定义查询

    JavaFX 8,带有复选框滚动 Pane 的 ListView 问题

    java - Spring 从属性 bean 引用属性

    java - 如果唯一键匹配,则跳过持久化实体

    java - JPA Hibernate Spring MySql Tomcat - 连接到 2 个数据库

    java - 如何按字母顺序对 HashMap 条目进行排序?