Java 如何建立具有持久层的好友系统模型?
您好,我正在尝试google app engine的新Java支持,我正在尝试为我的所有对象创建一个持久层。我试图建立一个朋友关系模型,但遇到了问题。我使用JPA持久化对象,并使用JPA注释定义持久化对象 我的想法是这样做: 用户对象:Java 如何建立具有持久层的好友系统模型?,java,google-app-engine,jpa,persistence,Java,Google App Engine,Jpa,Persistence,您好,我正在尝试google app engine的新Java支持,我正在尝试为我的所有对象创建一个持久层。我试图建立一个朋友关系模型,但遇到了问题。我使用JPA持久化对象,并使用JPA注释定义持久化对象 我的想法是这样做: 用户对象: @Entity public class User { @Column(name="user_id") @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Extension(vendorNam
@Entity
public class User {
@Column(name="user_id")
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String id;
@OneToMany(cascade={CascadeType.ALL},mappedBy="invitee")
private List<Connection> IncConnections;
@OneToMany(cascade={CascadeType.ALL},mappedBy="initiator")
private List<Connection> OutConnections;
}
但当我尝试此操作时,我得到了一个错误:
应用引擎ORM不支持多个父密钥提供程序字段
那么,有没有人知道如何在不使用多个父密钥的情况下对朋友系统进行建模
希望有人能帮忙 我还从来没有在项目中实际使用过google app engine,但首先要了解它的持久性,它不是一个关系数据库。我相信它使用了一个键值存储 因此,在使用应用程序引擎时,您需要以不同的方式考虑持久性 从文件中: 应用程序引擎实现不支持JPA接口的以下功能:
- 拥有多对多关系和无主关系。您可以使用显式键值实现无主关系,尽管API中不强制执行类型检查
- “加入”查询。在对父类执行查询时,不能在筛选器中使用子实体的字段。请注意,您可以在查询中使用键直接测试父级的关系字段
- 聚合查询(分组依据、拥有、总和、平均值、最大值、最小值)
- 多态查询。不能通过查询类来获取子类的实例。每个类在数据存储中由一个单独的实体类表示
一般来说,您必须自己与GAE保持任何关系。GAE为此提供的最佳工具记录在其关于的部分中。特别是,我认为关于“多对多”关系的部分是相关的 从这些示例来看,您似乎仍然需要自己完成大部分维护引用完整性的工作。因为这些可能位于单独的实体组中,所以您可能还需要大量代码来处理可能中断的关系。
使用Objectify
Using Objectify
class User {
@Id Long userId;
String email;
}
class UserFriendMap {
@Id Long id;
@Parent OKey<User> parent;
Set<OKey<User>> friend; // 5000 max
}
类用户{
@Id长用户Id;
字符串电子邮件;
}
类UserFriendMap{
@Id长Id;
@亲子关系;
设置friend;//5000最大值
}
令人惊讶的是,GAP支持JPA,尽管它在bigtable上运行。我知道它支持JPA,但不能在表上使用联接。因此,你必须重新思考你的模型。是的,我知道这一点,我还没有太多的坚持经验,所以我真的可以利用一个想法来接近这个模型。
Using Objectify
class User {
@Id Long userId;
String email;
}
class UserFriendMap {
@Id Long id;
@Parent OKey<User> parent;
Set<OKey<User>> friend; // 5000 max
}