Grails 使用关联从YAML加载GORM

Grails 使用关联从YAML加载GORM,grails,groovy,gorm,grails-2.0,snakeyaml,Grails,Groovy,Gorm,Grails 2.0,Snakeyaml,所以我有3个域,Feed,Source,和Article。他们的设置与此类似,尽管我删除了所有不描述他们关系的成员 class Feed { static hasMany = [sources:Source] static constraints = { } } class Source { static belongsTo = [feed:Feed] static hasMany = [articles:Article] static constraints = {

所以我有3个域,
Feed
Source
,和
Article
。他们的设置与此类似,尽管我删除了所有不描述他们关系的成员

class Feed {
static hasMany = [sources:Source]
    static constraints = {
    }
}

class Source {
static belongsTo = [feed:Feed]
static hasMany = [articles:Article]
    static constraints = {
    }
}

class Article {

static belongsTo=[source:Source]

    static constraints = {
    }
}
在我的
Bootstrap.groovy
文件中,我加载了一个类似这样的YAML文件(请记住,上面引用的域是片段)

使用SnakeYAML,我能够加载
提要
,并验证它是否包含1个
,以及
是否包含2个
文章
s

Object data = yaml.loadAll(new FileInputStream(servletContext.getRealPath('/path/to/yaml/file.yml')));
(data as Feed).save(failOnError: true)
我试图保存时产生以下错误:

Error |
2014-03-14 12:23:38,861 [localhost-startStop-1] ERROR hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
Message: null id in com.my.package.model.Source entry (don't flush the Session after an exception occurs)

我也尝试过使用
flush:false
保存,但没有帮助。我做错了什么?

所以这就是我最终解决问题的方法

如问题中所述,
提要
有许多
s,其中有许多
文章
s。yaml文件与问题中所述相同。对于我的
提要
我添加了

static mapping = {
    sources cascade: "all"
}
对于来源,我补充道

static mapping = {
    articles cascade: "all"
}
用于将yaml文件加载到DB的groovy代码如下

for (Object data : yaml.loadAll(new FileInputStream(servletContext.getRealPath('/WEB-INF/seeds/quitsmart.yml')))) {
    for (Source source : (data as Feed).sources) {
        for (Article article : source.articles) {
                source.addToArticles(article)
            }
            (data as Feed).addToSources(source)
        }
        (data as Feed).save(failOnError: true)
    }
}

请告诉我是否有其他方法可以做到这一点,因为这可能不是最好的解决方案。

您可以发布实际的域类吗?我担心您在
Source
中指定了
id
生成策略。
for (Object data : yaml.loadAll(new FileInputStream(servletContext.getRealPath('/WEB-INF/seeds/quitsmart.yml')))) {
    for (Source source : (data as Feed).sources) {
        for (Article article : source.articles) {
                source.addToArticles(article)
            }
            (data as Feed).addToSources(source)
        }
        (data as Feed).save(failOnError: true)
    }
}