将实体及其所有相关实体保存在 spring boot jpa 中的单个保存中

bas*_*seo 7 java jpa spring-boot

我正在使用 Spring Boot、REST 和 JPA 来构建我的应用程序。在应用程序中,有 4 个具有一对多关系的实体。

是否可以在一次保存操作中保存多个实体?

请帮忙!

父类.java

@Entity
@Data
@NoArgsConstructor 
public class Parent implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private long id;
    private String name;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<ChildA> childA = new ArrayList<>();

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<ChildB> childB = new ArrayList<>();

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private List<ChildC> childC = new ArrayList<>();

    ... getter and setter ...

}
Run Code Online (Sandbox Code Playgroud)

ChildA.java

@Entity
@Data
@NoArgsConstructor
public class ChildA{
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private long id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "parentId")
    private Parent parent;

    private String name;

    public void setParent(Parent parent){
        this.parent = parent;
    }

    ... getter and setter ...
}
Run Code Online (Sandbox Code Playgroud)

ChildB.javaChildC.java与 ChildA.java 类似

存储库.java

@Repository
public interface repository extends JpaRepository<Parent, Long> {

}
Run Code Online (Sandbox Code Playgroud)

我想保存这个json。

{
  "name": "parent-name",
  "childA": [
    {
      "name": "parent-childA"
    }
  ],
  "childB": [
    {
      "name": "parent-childB"
    }
  ],
  "childC": [
    {
      "name": "parent-childC"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

D B

Parent
id   |   name
5        parent-name

ChildA
id   |   parent-id  |  name
 1   |       5      |  parent-childA

ChildB
id   |   parent-id  |  name
 1   |       5      |  parent-childA

ChildC
id   |   parent-id  |  name
 1   |       5      |  parent-childA
Run Code Online (Sandbox Code Playgroud)

bas*_*seo 8

我找到了答案。谢谢回复。

@RestController
public class ParentController {
    @Autowired
    private ParentRepository parentRepository;

    @PutMapping("")
    public void save(@RequestBody @Valid Parent parent) {
        parentRepository.save(parent);

    }
Run Code Online (Sandbox Code Playgroud)

Parent.java添加@JsonManagedReference

@JsonManagedReference
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private List<ChildA> childA = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

并且Child类 ChildA.java、ChildB.java、ChildC.java添加@JsonBackReference

@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "parentId")
private Parent parent;
Run Code Online (Sandbox Code Playgroud)