我试图以一种既适用于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。例如,我可以拥有书籍项目并查找这些属性:属性(1,“category:book”)属性(3,“text:anatomy”),属性(10,“text:brain”)。您可以将属性视为Items的标记。
JAE JPA不支持ManyToMany关系。有任何建议如何建模吗?
提前谢谢。
答案 0 :(得分:0)
GAE JPA显然支持无主 M-N关系,但是你的模型中没有任何M-N(即Property不知道Item)。您有一个集合字段,因此您将其标记为@OneToMany。由于GAE在查询中的允许程度很小,因此查询会更成问题。 (即加入方式不多)
答案 1 :(得分:0)
以下是我最终解决的问题:
@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
访问属性。