有没有办法在grails中创建与arbitraray域对象的关系

时间:2015-11-25 21:30:45

标签: grails gorm

有没有办法在grails中创建与任意域对象的关联?

这样的东西
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.

2 个答案:

答案 0 :(得分: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);
    }
}

假设您有一个Book and Author(不会覆盖域对象的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

答案 1 :(得分:0)

更新(根据评论)

由于您不想(或不能)在您的域模型中扩展另一个类,因此使用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如何为数据库中的数据建模的情况下执行此操作是短视的。你应该完全研究这些话题,以确保这真的是你想要的。