【问题标题】:Google App Engine GAE JPA ManyToMany relationship [duplicate]Google App Engine GAE JPA 多对多关系 [重复]
【发布时间】:2012-12-16 15:15:51
【问题描述】:

我正在尝试以一种既适用于 hibernate JPA 又适用于 GAE JPA 的方式对我的对象进行建模。 我有一个类Item,它有一个属性列表。我需要找到所有具有特定属性的项目。例如:

@Entity
public class Item {
    @Id
    public Long id;

    @ManyToMany(name="properties")
    public List<Property> props; 
}

@Entity
public class Property {
    @Id
    public Long id;
    public String value;
}

我的查询就像

select i from Item i join i.props p where p.id=1 and p.id=3 and p.id=10 

其中 1、3 和 10 是我要查找的属性的 ID。例如,我可以拥有书籍项目并查找以下属性:Property(1, "category:book") Property(3, "text:anatomy"), Property(10, "text:brain")。您可以将属性视为 Items 的标签。

JAE JPA 不支持多对多关系。有什么建议如何建模吗?

提前谢谢你。

【问题讨论】:

    标签: java google-app-engine jpa data-modeling relationship


    【解决方案1】:

    GAE JPA 显然确实支持 unowned M-N 关系,但是您的模型中没有任何 M-N 关系(即 Property 不知道 Item)。您有一个集合字段,因此您将其标记为@OneToMany。由于 GAE 允许的查询很少,因此查询会更成问题。 (即没有太多的连接方式)

    【讨论】:

      【解决方案2】:

      这是我最终得到的解决方案:

      @Entity
      public class Item implements Serializable {
          @Id
          public Long id;
      
          @Unowned
          @OneToMany(cascade = CascadeType.ALL)
          @Column(name = "properties")
          public Set<Property> properties = new HashSet<Property>();
      
          @ElementCollection
          public Set<Long> propIds = new HashSet<Long>();
      }
      
      @Entity
      public class Property implements Serializable {
          @Id
          public Long id;
          public String value;
      }
      

      查询是这样的:

      select i from Item i where 1 member of i.propIds and 3 member of i.propIds
      

      这将返回我需要的所有项目。然后我可以通过item.properties访问属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-17
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多