2011-05-08 34 views
3

所以我知道這是可能的使用超類,但是,這是非常限制的靈活性。所以我的問題是,我可以使用接口嗎?某事ala。多態屬性在Grails中多對多映射?

interface Taggable { 
    /*Adds tag(s) and returns a list of currently set tags*/ 
    List<String> addTags(String ... tag) 
    /*Removes tag(s) and returns a list of currently set tags*/ 
    List<String> removeTags(String ... tag) 
} 

class User implements Taggable { 
    String username 
    static hasMany = [tags:Tag] 
} 

class Tag { 
    String name 

    static hasMany = [references:Taggable] 
    static belongsTo = Taggable 

    static constraints = { 
    name(nullable: false, blank: false, unique: true) 
    } 
} 

我感興趣的是對具有以下標記的對象的引用。但是這個對象不能擴展一個具體的類。這就是爲什麼即時通訊想知道這是否可以用接口來完成。

那麼,可以這樣做嗎?

回答

4

休眠可以映射一個接口 - see example。我懷疑Grails是否支持這種慣例映射 - 但您可以嘗試使用上例中的映射annotations或XML配置。

編輯:回答評論問題:

在數據庫級別,你必須有一個TaggableTag.References與外鍵引用。

  1. 鑑別打敗不了多態性,如果它的自動添加 - 例如,在表中每層次映射時,Hibernate /格姆爲了從數據庫中讀取對象時,找出一個具體的類增加了一個class場。

  2. 如果您Taggable點地圖到兩個表 - Taggable部分Taggable和其他一切具體的表,參考1:1 - 所有的鑑別工作要爲你由Hibernate完成。

BTW class領域是相當長的 - 它包含完整的類名

編輯2: 無論哪種方式,它變得很複雜,我會親自去與我的建議in another question的辦法:

  • 動態查詢所有與hasMany=[tags:Tag]財產加標籤接口的類;
  • 或不太可取 - 有一個手工製作的兒童桌和一個鑑別器。
+0

是的,你可能是對的,我不認爲我可以使用grails gorm mapping來做到這一點。然而,在你的例子中,似乎我需要在引用特殊類的時候添加鑑別符到註釋中,這有點打破了多態的目的。並且還會降低'Tag'實現的靈活性... **所以問題就變成了,是否可以有一個沒有鑑別符的映射,需要代碼中的類引用?** – netbrain 2011-05-10 12:13:50

+0

XML總是一個選項,我們贏了沒有對源代碼中實現類的引用......但是現在誰喜歡XML? – netbrain 2011-05-10 12:21:16

+0

對不起,沒有提供一個片段 - 這將需要很長時間。只是一個嘗試的想法。註釋仍然可能有效,人們確實使用XML--爲不同的DBMS提供不同映射的能力。只要選擇對特定情況更好的方法即可。 – 2011-05-10 12:27:26