【问题标题】:how to model a friends system with persistency layer?如何使用持久层建模好友系统?
【发布时间】:2010-10-20 19:53:48
【问题描述】:

您好,我正在尝试为谷歌应用引擎提供新的 Java 支持,并且我正在尝试为我的所有对象创建一个持久层。我正在尝试建立朋友关系模型,但遇到了问题。我使用 JPA 来持久化对象并使用 JPA 注释定义我的持久性对象。

我的想法是做以下事情:

用户对象:

@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;
}

.

@Entity
public class Connection {

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

@ManyToOne(cascade={CascadeType.ALL})
User initiator;

@ManyToOne(cascade={CascadeType.ALL})
User invitee;
}

但是当我尝试这个时,我得到了错误: App Engine ORM 不支持多个父键提供者字段

那么有没有人知道如何在不使用多个父键的情况下对朋友系统建模?

希望有人能帮忙!

【问题讨论】:

    标签: java google-app-engine jpa persistence


    【解决方案1】:

    一般来说,您必须自己与 GAE 保持任何关系。 GAE 为此提供的最佳工具记录在其Unowned Relationships 部分中。特别是,我相信关于“多对多”关系的部分是相关的。

    从示例中,您似乎仍然需要自己完成大部分维护参照完整性的工作。由于这些可能位于不同的实体组中,因此您可能还必须拥有大量代码来处理可能中断的关系。

    【讨论】:

      【解决方案2】:
      Using Objectify
      
      class User { 
         @Id Long userId; 
         String email; 
      } 
      
      class UserFriendMap { 
         @Id Long id; 
         @Parent OKey<User> parent; 
         Set<OKey<User>> friend; // 5000 max
      } 
      

      【讨论】:

        【解决方案3】:

        我还没有真正将 google 应用引擎用于项目,但关于它的持久性,您需要了解的第一件事是它不是关系数据库。我相信它使用键值存储。

        因此,在使用应用引擎时,您需要以不同的方式考虑持久性。

        来自文档:

        App Engine 实现不支持 JPA 接口的以下功能:

        • 拥有多对多关系和无拥有关系。您可以使用显式 Key 值实现无主关系,但 API 中不强制执行类型检查。
        • “加入”查询。在对父种类执行查询时,您不能在过滤器中使用子实体的字段。请注意,您可以使用键直接在查询中测试父级的关系字段。
        • 聚合查询(分组依据、拥有、总和、平均、最大值、最小值)
        • 多态查询。您不能通过查询类来获取子类的实例。每个类在数据存储区中由一个单独的实体种类表示。

        http://code.google.com/appengine/docs/java/datastore/usingjpa.html

        【讨论】:

        • 令人惊讶的是,GAP 支持 JPA,尽管它运行在 bigtable 上。
        • 我知道确实如此,但您不能在表上使用联接。因此,您必须重新考虑您的模型。
        • 是的,我知道这一点,我在持久性方面还没有太多经验,所以我真的可以使用一个想法来处理这个模型。
        猜你喜欢
        • 2017-11-20
        • 2011-08-16
        • 1970-01-01
        • 2020-09-01
        • 2017-03-24
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 2011-04-29
        相关资源
        最近更新 更多