Grails 使用关联从YAML加载GORM
所以我有3个域,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 = {
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)
}
}