Google app engine GAE数据存储外键和联接
我正在为一些对我来说很简单的事情与gae抗争。 让我解释一下。 我有一个关于一个人的数据表,我决定使用电子邮件作为idGoogle 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电子邮
@Entity
public class Person{
@Id
@Column(name = "email")
String email;
...
我想完成的是
提前感谢数据存储不是关系数据库,因此在开始设计解决方案之前,您应该先了解这些概念。您要做的是将一个方形的销钉装入一个圆孔中:您不仅会发现缺少连接,还必须在删除时实现自己的级联(提示:您可能不想这样做,但如果这样做了,并且您有大量数据,请参阅) 您没有提供太多的代码,我也不知道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();