5

我找不到任何有关在 Google App Engine 上使用 Objectify 在对象之间建立多对多关系的适当方式的文档。

谁能解释如何做到这一点?我需要为此创建一个新的“加入”类吗?效率会有多高?

4

4 回答 4

2

这不是在 Objectify 中映射多对多关系的最佳方法。最好的方法是创建一个映射关系的实体。例如,假设您有两个对象 A 和 B,并且它们以某种方式关联。他们可以创建一个类似于:

Class Link{
    Key<?> master;
    key<?> slave;

    public Link(){

    }

    public setLink(Entity master, Entity slave){
     //initialize

    }

}

然后,您可以创建一个链接实体来对关系建模。这会自动映射一对一或多对多关系

于 2012-05-15T18:54:13.307 回答
2

您需要支持哪些类型的查询?

最简单的解决方案是:

@Entity
public class StoredObject {
    @Id
    private Long id;

    private List<Long> relatedIds;
}

然后,给定 a StoredObject,您可以调用objectify.get(StoredObject.class, storedObject.getRelatedIds())以获取所有相关的 id。

为了加快我自己的应用程序中的一些查询,我确实创建了一些连接类。费用来自写入时间(您必须维护连接),但读取时间是具有连续结果的单个索引扫描!

于 2012-02-05T17:52:38.533 回答
2

我已经使用 Objectify 4.0 解决了这种方法:

@Entity
@Index
public class Module {

@Id
private Long id;
private String name;

@Load
private List<Ref<Template>> templates;


public List<Template> getTemplates() {
    List<Template> templates = new ArrayList<Template>();

    for (Ref<Template> temp : this.templates) {
        templates.add(temp.get());
    }

    return templates;
}

public void setTemplates(List<Template> templatesParm) {
    List<Ref<Template>> templates = new ArrayList<Ref<Template>>();

    for (Template temp : templatesParm) {
        templates.add(Ref.create(temp));
    }

    this.templates = templates;

}
于 2013-02-21T02:56:04.240 回答
1

让我们考虑一下单多;如果您希望对象 A “拥有许多”对象 B,则只有两种方法可以做到:

  • 关系方式:使每个 B 指向 A。当您拥有 A0 并想要所有与之相关的 B 时,只需查询指向给定 A0 的 B。

  • NoSQL / ObjectStore 方式:使 A 有一个字段,其中包含指向 B 的指针(键)列表。请注意,这种方式还允许 B 以特定顺序排列(尽管 GAE/Java 文档相反。)

哪个最好取决于。ObjectStore 方式受对象大小的限制。关系方式存在一个微妙的问题,除非 A 和所有 B 都在同一个实体组中,并且您在事务中执行祖先查询(或者即使它不在事务中),您都可以保证得到所有指向该 A 的 B。但是,如果 A 和 B 跨越实体组,则有可能(尽管可能不太可能)您会得到一个不满足查询谓词的 B,或者错过一个满足的 B:https ://developers.google.com/appengine/articles/transaction_isolation

在(现在的标准)High Replication Datastore 中,事务通常在提交返回后的几百毫秒内完全应用。但是,即使没有完全应用,后续的读取、写入和祖先查询也将始终反映提交的结果,因为这些操作在执行之前会应用任何未完成的修改。但是,跨越多个实体组的查询在执行之前无法确定是否有任何未完成的修改,并且可能会返回陈旧或部分应用的结果。

现在对于很多很多:我曾经读过一个故事,描述了在太空中上厕所;有四种组合:太空船内/外和上厕所两种。对于在船外(穿着太空服)和消除固体的最后一种组合,唯一的答案是“没有优雅的方式”(也是文章的标题):http://settlement.arc.nasa .gov/CoEvolutionBook/SPACE.HTML#There Ain't No Graceful Way ... 这也是 GAE 中多对多关系的答案。您可以使用连接类构建它们,连接的每一侧都可以通过查询或键列表来实现。

于 2012-05-19T07:49:39.173 回答