2013-09-29 55 views
0

我想創建一個通用的多對多關係(List)。如何在Hibernate中創建多態/泛型多對多關係?

使用下面的示例域:

+-------+ +----------+ +-----------+ 
| Issue | | Web Page | | Wiki Page | 
+-------+ +----------+ +-----------+ 

我woulk想創建通用鏈路關聯像以下,其中fromto可以是上述的任何域的對象。

+---------------------+ 
| Link    | 
+---------------------+ 
| Object: from  | 
| Object: to   | 
| String: description | 
+---------------------+ 

所以Issue具有一對多Link,這裏的問題是關係的一個側面。

我設想使用鏈接表看起來類似以下內容:

Link Table 
| ID | SRC_ID | SRC_CLASS | DEST_ID | DESC_CLASS | 

所以SRC_IDDEST_ID外鍵進入相應的表。

Link表的映射應該是什麼樣子?

回答

0

Hibernate您不應該從Entity類手動創建表。只需將註釋@ManyToMany添加到您的pojo中,hibernate將生成與相關表的所有外鍵關係的數據庫模式。

Hibernate的許多一對多的單向映射想:

@Entity 
class Issue{ 
    @ManyToMany 
    List<Link> links; 
} 

@Entity 
class Link{ 
} 

如果您的應用程序的Java SE,然後用SchemaExport類生成的數據庫架構。

+0

是的,我明白所有這些 - 但添加表結構示例的原因是爲您提供了我正在尋找的內容。由於關係的「to」和「from」兩端可以是多種類型,我不確定如何編碼鏈接本身 – Tim

0

我已經通過從域對象完全外化它來實現這種關係。

例(Groovy的+ Grails的)

class Link{ 
    String fromClass 
    long fromId 
    String toClass 
    long toId 
    String description 

    Link(){} 
    Link(Object src, Object dest, String descrption){ 
     fromClass=src.class.name 
     fromId=src.id 
     toClass=dest.class.name 
     toId=dest.id 
     this.description=description 
    } 

    Object getFrom(){ 
     // Invoke GORM static finder 
     Class.forName(fromClass)."get"(fromId) 
    } 

    Object getTo(){ 
     // Invoke GORM static finder 
     Class.forName(toClass)."get"(toId) 
    } 
} 

與相關的服務層來創建/檢索對象:

import org.springframework.transaction.annotation.Transactional 
class LinkableService { 
    @Transactional 
    public void link(Object src, Object dest, String description){ 
    Link link = new Link(src,dest,description) 
    link.save() 
    } 

    @Transactional(readOnly=true) 
    public Collection<Link> links(Object subject){ 
    def fromLinks = Link.findAllWhere(fromClass:subject.class.name, fromId:subject.id) 
    def toLinks = Link.findAllWhere(toClass:subject.class.name, toId:subject.id) 
    def allLinks = new ArrayList<Link>(fromLinks) 
    allLinks.addAll(toLinks) 
    return allLinks 
    } 

} 

我有點擔心的表現,但我只希望要處理小數據集,它不應該是一個主要問題。沒有指標,我不會優化!

但是有沒有更好的解決方案?