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

Java 在spring boot jpa中的单个存储中保存一个实体及其所有相关实体,java,jpa,spring-boot,Java,Jpa,Spring Boot,我正在使用SpringBoot、REST和JPA构建我的应用程序。 在应用程序中,有4个实体具有一对多关系 是否可以在一次保存操作中保存多个实体 请帮忙 Parent.java @Entity @Data @NoArgsConstructor public class Parent implements Serializable { @Id @GeneratedValue(strategy= GenerationType.AUTO) private long id;

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

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

请帮忙

Parent.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 ...

}
@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 ...
}
@Repository
public interface repository extends JpaRepository<Parent, Long> {

}
ChildB.javaChildC.java与ChildA.java类似

Repository.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 ...

}
@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 ...
}
@Repository
public interface repository extends JpaRepository<Parent, Long> {

}
DB

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
我找到了答案。 谢谢你的回复

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

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

    }
Parent.java添加@JsonManagedReference

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

我可以问一个反问题吗。您预期的优势是什么?只要将所有存储库调用放在一个事务中,那么您将在一个事务中运行多个SQL语句。事务是最大的开销,网络调用是最小的。通常,总体性能优势是最小的。请公布您是如何保存的,您可以使用repositary.save(object)实现这一点。唯一需要做的事情就是使用方向映射集。i、 e对于每个子级,您应该设置child.setParent(parent)。