2011-08-05 380 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' –