【问题标题】:AppEngine: Retaining orphans in an owned, bidirectional one-to-many relationshipAppEngine:以拥有的双向一对多关系保留孤儿
【发布时间】:2011-10-19 15:37:59
【问题描述】:

我有以下两个实体:

@Entity
public class SupermarketChain {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String key;

@OneToMany(mappedBy = "supermarketChain")
@Basic
private List<Supermarket> supermarkets;
}

@Entity
public class Supermarket {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String key;

@ManyToOne(optional=true)
private SupermarketChain supermarketChain;
}

当我使用 em.remove(SupermarketChain.class, key) 删除父级时,所有孤儿也将被删除。我阅读了文档中的relevant paragraph,甚至使用带有@Element(dependent = "false") 的JDO 进行了尝试,但问题仍然存在。我怎样才能保留这种关系中的孤儿?

【问题讨论】:

    标签: google-app-engine jpa jdo


    【解决方案1】:

    留住一个孤儿是没有意义的。在 GAE JDO/JPA v1 中,所有关系都是“拥有的”,因此您必须拥有任何孩子的父母。如果父级不再存在,则子级将被删除。总是。

    在 GAE JDO/JPA v2 中,您还可以拥有无​​主对象,因此没有“父对象”,因此它们可以在之后继续存在。

    【讨论】:

    • 在 App Engine 中保留(或创建)孤儿是有意义的。拥有 2 个共享一个共同父级的实体,即使该父级不存在,也是您将事物放入同一个实体组的方式 - 通过拥有一个虚拟实体作为它们两者的父级。我认为这是 JDO 语义和 App Engine 语义差异到足以引起一些混淆的情况。说“留住孤儿没有意义”是不公平的。
    • 不知道您在“JDO 语义”和“AppEngine 语义”之间所指的区别是什么。 JDO 只是定义了一个 API。当没有父键时,它不会强制删除或以其他方式(因为它也没有强制要求有关父键的任何内容)。所描述的逻辑(由我在上面)是 GAE 工作人员在他们的 JDO 插件中体现的(因为这是有道理的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多