为什么持久方法被调用两次?

时间:2015-03-12 12:46:41

标签: java jpa many-to-many eclipselink

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

我的服务类:

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类与自身有两个oneToMany关系(它是与附加列的manyToMany关系):

MyEntity1类:

 @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>();

1 个答案:

答案 0 :(得分:0)

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

当您在某个实体上调用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