2011-08-05 302 views
0

我遇到的情况,我有一个名为Page对象,并要求标签另一个对象,这两者之间的关系是页有标签(多对多),但同样的标签也可以与产品共享,在这里关系也是一样的产品有标签(多对多)。JPA共享实体映射

在正常情况下,我将创建一个标签式的列,其中类型可以是枚举值(产品页),并使用象SELECT * FROM标签,其中PARENT_ID = PAGE_ID和类型=页。

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

+1

问题:如果页面 - >标签的关系是一个到很多,那么相同的标签不能用于多个页面,这同样适用于产品。这是你想要的行为吗? – Augusto

+0

噢亚对不起它很多很多,我将编辑我的问题 –

回答

0

我想你应该创建关联的两个表。一个将Pages与标签相关联,一个将产品与标签相关联。代码:

@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 
+0

但在通过标签搜索条目的情况下,我需要返回与该标签,然后我需要搜索2代表的产品和网页,以后我可能会引入一个新的这可以被标记对象,那么它变得复杂,同时通过标签 –

+0

我宁愿使用继承然后搜索,你可以创造一些@MappedSuperclass TagContainer,铁,其中将包含一套标记和编号。这样,您就可以使用像'选择T FROM TagContainer牛逼JOIN t.tags标签WHERE tag.id =:tagId' –