为什么 persist 方法被调用两次?

Why is persist method called twice?

在我的服务级别中,我从 Entity1 class 创建了一个新对象并保留它,然后在其上调用 setter。但毕竟,将创建另一个来自 Entity1 的对象并将其插入数据库(因此我将在 Entity1 table 中插入两行而不是一行)。 MyEntity1 与自身有 many-to-many 关系,我在调用 persist 方法后设置它。 我的问题是我找不到为什么要在我的应用程序中创建额外的 Entity1 对象。

我的服务class:

MyEntity1 e1 = new MyEntity1();
em.persist(e1); 
MyEntity2 e2 = new MyEntity2();
e2.setChild(e1);
e2.setParent(e1);
e1.getParent().add(e2);
e1.getChildren().add(e2);

MyEntity1 class 与自身有两个 oneToMany 关系(它是与附加列的 manyToMany 关系):

MyEntity1 class:

 @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "child", orphanRemoval = true)
    private List<MyEntity2> parent = new ArrayList<MyEntity2>();

 @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "parent")  
    private List<MyEntity2> children= new ArrayList<MyEntity2>();

如果我理解正确(如果没有一些代码很难理解),你会坚持一个实体,然后添加与另一个实例的关系?

当您在实体上调用 persist 时,它会变为 managed entity,这意味着 JPA 提供程序现在管理其生命周期。这意味着您不再需要调用 mergepersist 来保存更改。 JPA 提供程序自动执行此操作,这就是第二个实体也被保留的原因。

MyEntity e1 = new MyEntity();
em.persist(e1); // this persists the entity, and makes it managed 
MyEntity e2 = new MyEntity();
e1.setRelation(e2);
// this will also persist (if cascade is properly configured) e2 at the end of transaction, without you persisting it manually