【问题标题】:Jointable update between transient and persistent objects?瞬态对象和持久对象之间的可连接更新?
【发布时间】:2010-11-24 14:53:28
【问题描述】:

我在持久对象(通过查询检索)和新创建的瞬态对象(使用 new 创建,尚未持久化)之间存在多对多关系。 它们通过@JoinTable 关联进行连接,例如:

@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "adccollectiontype_cn_node_type", joinColumns = {
    @JoinColumn(name = "idadccollectiontype")
}, inverseJoinColumns = {
    @JoinColumn(name = "idcn_node_type")
})

在另一端:

@ManyToMany(mappedBy="cnNodeTypes", cascade=CascadeType.ALL)

注意CascadeType.ALL

如果我只是通过将每个对象添加到另一个对象的集合中来创建这两个对象之间的关联,然后再持久化(另一个对象,并且依赖于级联),那么连接表不会更新。

但是,如果我在进行关联之前手动 persist 瞬态对象,它似乎可以工作。

现在我试图找到一些关于这个案例的信息,为什么以及如何工作,但我找不到任何解释。也许有人可以启发我,我的假设是否正确,以及背后的原因。

【问题讨论】:

    标签: eclipselink jpa-2.0 java-ee-6


    【解决方案1】:

    我不确定是否有足够的信息来真正解释它。如果您正在修改托管实体,则应在事务提交或调用刷新时获取更改。那么,现有实体是在当前 EntityManager 上下文中管理的吗?下面的工作吗?

    ManagedEntity oe = em.find(ManagedEntity.class, id);
    NodeType nt = new NodeType(id);
    oe.getCnNodeTypes().add(nt);
    nt.getOtherEntityCollection().add(oe);
    em.flush();
    

    您也可以尝试在托管实体上调用 merge 以使其级联到新实体实例。

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 2012-07-12
      • 2019-06-28
      • 2013-01-06
      • 2011-05-25
      • 2014-03-29
      • 2011-02-04
      • 1970-01-01
      • 2012-06-04
      相关资源
      最近更新 更多