【问题标题】:JPA Shared Entity mappingJPA 共享实体映射
【发布时间】:2011-10-20 19:10:20
【问题描述】:

我有一个场景,我有一个叫做Page的对象,还有一个叫做Tag的对象,这两者之间的关系是Page has Tags(many to many),但是同样的Tags也可以与Product共享,这里的关系也是相同的产品有标签(多对多)。

在正常情况下,我将在 Tag 中创建一个类型列,其中类型可能是 Enum 值(产品、页面),并使用 SELECT * from Tags where parent_id = page_id and type = page 之类的查询。

如何在JPA中做到这一点(如何创建这种关系以及如何查询数据)

【问题讨论】:

  • 问题:如果Page->Tag的关系是一对多,那么同一个标签不能用于多个页面,同样适用于Products。这是你想要的行为吗?
  • 哦,对不起,很多人,我会编辑我的问题

标签: java hibernate jpa jpa-2.0


【解决方案1】:

我认为您应该创建两个关联表。一种将页面与标签相关联,一种将产品与标签相关联。代码:

@Entity
@Table(name = "page")
class Page {
  ....

    @OneToMany
    @JoinTable(name = "jnd_pages_tags", joinColumns = @JoinColumn(name = "page_fk"),
            inverseJoinColumns = @JoinColumn(name = "tag_fk"))
    private Set<Tag> tags;      
}

@Entity
@Table(name = "page")
class Product {
  ....

    @OneToMany
    @JoinTable(name = "jnd_products_tags", joinColumns = @JoinColumn(name = "products_fk"),
            inverseJoinColumns = @JoinColumn(name = "tag_fk"))
    private Set<Tag> tags;      
}

@Entity
@Table(name = "tags")
class Tag {
.....
}

要为页面选择相应的标签,请使用

SELECT p.t FROM Page p WHERE p.id = :id

要为产品选择相应的标签,请使用

SELECT p.t FROM Product p WHERE p.id = :id

【讨论】:

  • 但是如果按标签搜索项目,我需要返回与该标签相关的产品和页面,然后我需要搜索2个表,稍后我可能会再引入一个可以标记的对象,然后通过标签搜索变得复杂
  • 我宁愿使用继承,你可以创建一些@MappedSuperclass TagContainer,f.e.,它将包含一组标签和id。这样你就可以使用SELECT t FROM TagContainer t JOIN t.tags tag WHERE tag.id= :tagId
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2020-03-21
  • 2011-07-25
  • 2015-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多