2015-11-25 57 views
0

有沒有辦法在grails中創建任意域對象的關聯?有沒有辦法在grails中創建與arbitraray域對象的關係

喜歡的東西

class ThingHolder { 
    DomainObject thing; 
} 

然後

Book b=new Book(title: "Grails 101").save() 
Author a=new Author(name: "Abe").save() 

ThingHolder t1=new ThingHolder(thing:b).save() 
ThingHolder t2=new ThingHolder(thing: a).save() 

這樣

ThingHolder.get(t1.id).thing // will be a Book 

ThingHolder.get(t2.id).thing // will be an Author. 

回答

1

我仍然在尋找一種可行的方式來做到這一點,但這似乎完成了工作。

class ThingHolder { 
    static constraints = { 
     thing bindable:true // required so 'thing' is bindable in default map constructor. 
    } 

    def grailsApplication; 

    Object thing; 

    String thingType; 
    String thingId; 

    void setThing(Object thing) { //TODO: change Object to an interface 
     this.thing=thing; 
     this.thingType=thing.getClass().name 
     this.thingId=thing.id;  //TODO: Grailsy way to get the id 
    } 

    def afterLoad() { 
     def clazz=grailsApplication.getDomainClass(thingType).clazz 
     thing=clazz.get(thingId); 
    } 
} 

假設您有書和作者(不覆蓋域對象的ID屬性)。

def thing1=new Author(name : "author").save(failOnError:true); 
def thing2=new Book(title: "Some book").save(failOnError:true); 

new ThingHolder(thing:thing1).save(failOnError:true) 
new ThingHolder(thing:thing2).save(failOnError:true) 

ThingHolder.list()*.thing.each { println it.thing } 

我在這兩個答案中發現了一些非常有用的提示。

How to make binding work in default constructor with transient values.

How to generate a domain object by string representation of class name

0

UPDATE(基於評論)

既然你不想(或不能)在你的領域模型擴展另一個類,這將不使用GORM是不可能的。

原來的答案

是的,你可以做到這一點。這就是所謂的繼承。在你的情況下,你將有一個Thing這是AuthorBook的超級類別。

你的域模型可能是這樣的:

class Thing { 
    // anything that is common among things should be here 
} 

class Author extends Thing { 
    // anything that is specific about an author should be here 
} 

class Book extends Thing { 
    // anything that is specific about a book should be here 
} 

class ThingHolder { 
    Thing thing 
} 

由於兩個AuthorBook延長Thing它們被認爲是Thing爲好。

但是,如果不理解繼承,以及Grails/GORM如何模擬數據庫中的數據,那麼目光短淺。你應該充分研究這些話題,以確保這真的是你想要的。

+0

我們的目標是能夠故事任何域對象。我不希望系統中的每個域對象都存儲在Thing表中,也不希望設置Table_per_hierarchy並在整個地方導致外部連接。 – burns

+0

然後答案是否定的。你無法在GORM中做到這一點。 –

+0

感謝您的快速回答。我希望能夠創建一個帶有列ID,thing_discriminator,thing_id或類似東西的Thing_holder表。 – burns

相關問題