Google app engine GAE数据存储外键和联接

Google app engine GAE数据存储外键和联接,google-app-engine,jpa,one-to-many,cascade,jointable,Google App Engine,Jpa,One To Many,Cascade,Jointable,我正在为一些对我来说很简单的事情与gae抗争。 让我解释一下。 我有一个关于一个人的数据表,我决定使用电子邮件作为id @Entity public class Person{ @Id @Column(name = "email") String email; ... 我想完成的是 创建一个包含两列的表,两列都包含来自Person的电子邮件,意思是“第1列中的电子邮件已写入第2列中的电子邮件” 当我从Person中删除一行时,我希望表中第1点的所有行(在第1列或第2列中包含此Person电子邮

我正在为一些对我来说很简单的事情与gae抗争。 让我解释一下。 我有一个关于一个人的数据表,我决定使用电子邮件作为id

@Entity
public class Person{
@Id
@Column(name = "email")
String email;
...
我想完成的是

  • 创建一个包含两列的表,两列都包含来自Person的电子邮件,意思是“第1列中的电子邮件已写入第2列中的电子邮件”
  • 当我从Person中删除一行时,我希望表中第1点的所有行(在第1列或第2列中包含此Person电子邮件)都会作为级联效应被删除
  • 我想查询我的数据库,这样,在给定电子邮件地址的情况下,我将能够连接表中第1点的所有行,并提取给定电子邮件写给的人的所有数据(姓名、电话…)
  • 问题是,显然在gae中我不能使用join,而且我根本不知道如何创建具有级联效应的join表。 欢迎任何帮助。
    提前感谢

    数据存储不是关系数据库,因此在开始设计解决方案之前,您应该先了解这些概念。您要做的是将一个方形的销钉装入一个圆孔中:您不仅会发现缺少连接,还必须在删除时实现自己的级联(提示:您可能不想这样做,但如果这样做了,并且您有大量数据,请参阅)

    您没有提供太多的代码,我也不知道JPA(提示:看,它更适合于非关系数据存储),但您可能需要这样的东西(使用Objectify注释):

    然后我假设您将拥有某种
    消息
    实体(您称之为两列表):


    当然,您可以使用表示电子邮件的字符串,而不是使用
    Ref
    (本质上是a)。您可能也不想将
    电子邮件
    用作
    @Id
    ,因为这样会阻止用户更改其电子邮件地址。

    GAE数据存储不是关系数据库。不要试图把它当作一个整体来使用。
    @Entity
    public class Person {
        @Id
        String email;
        ...
    }
    
    @Entity
    public class Message {
        @Id
        Long msgId;
        @Index
        Ref<Person> from;
        @Index
        Ref<Person> to;
        ...
    }
    
    Person a = ofy().load().type(Person.class).id("a@example.com").now();
    Person b = ofy().load().type(Person.class).id("b@example.com").now();
    ...
    ofy().load().type(Person.class).filter("from =", Ref.create(a)).filter("to =", Ref.create(b)).list();