JPA共享实体映射

时间:2011-08-05 11:31:59

标签: java hibernate jpa jpa-2.0

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

在正常情况下,我将在Tag中创建一个类型列,其中type可以是Enum值(product,page),并使用来自标签的SELECT *查询,其中parent_id = page_id和type = page。

如何在JPA中执行此操作(如何创建此关系以及如何查询数据)

1 个答案:

答案 0 :(得分:0)

我认为你应该创建两个关联表。一个用于将Pages与标签相关联,一个用于将Products与标签相关联。代码:

@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