【问题标题】:Why is persist method called twice?为什么persist方法被调用两次?
【发布时间】:2015-03-12 12:46:40
【问题描述】:

在我的服务级别中,我从 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>();

【问题讨论】:

  • 你能更具体地谈谈这个问题吗?你说persist被调用了两次,这是应用程序调用的东西,而不是JPA,而在你的描述中你说“两个不同的对象被创建并存储在数据库中。”。创建了哪两个不同的对象,您如何指定实体的主键来区分它们?哪个实体有问题?
  • 是的,我编辑了这个问题。将创建一个额外的 Entity1 对象。

标签: java jpa many-to-many eclipselink


【解决方案1】:

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

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

【讨论】:

  • 我完全一样。首先我调用persist,然后调用setter。
  • 那么你有解释(阅读我的例子中的 cmets)。
  • 它与我的案例 predrag 不同。我添加了一些代码。
  • 其实基本一样。调用em.persist(e1) 后,实体e1 变为托管(more info)。之后,添加e2 作为它的关系。在事务结束时,JPA 提供者看到e1 的对象图中有一个新实体,并将其持久化(即e2)。结果是数据库中有两行。
  • 我的错误解释。 Entity1 中的两个对象将被插入到数据库中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 2021-07-13
相关资源
最近更新 更多