Загрузка Горма из ЯМЛА с ассоциациями
Итак, у меня есть 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, который выглядит следующим образом (имейте в виду, что домены, на которые ссылаются выше, являются фрагментами)
--- !!com.my.package.model.Feed
name: FeedName
sources:
- !!com.my.package.model.Source
link: "http://some.website.com"
description: "Description"
articles:
- !!com.my.package.model.Article
title: "We know quitting is tough but stay strong! We all have bad days, and you will get through this. Do whatever to boost your mood-just do not smoke."
- !!com.my.package.model.Article
title: "Keep staying strong & smokefree--you can do it! We know it is not easy but it is worth it. Check Smokefree.gov for new tools, apps, and contests."
Используя SnakeYAML, я могу загрузить a Feed
и проверить, что он содержит 1 Source
, и что Source
имеет 2 Article
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
, но это не помогает. Что я делаю не так?1 ответ:
Вот что я в конце концов сделал, чтобы решить свои проблемы....
Как указано в вопросе,
Feed
имеет многоSource
s, которые имеют многоArticle
s. файл yaml такой же, как указано в вопросе. Для моегоFeed
я добавилstatic mapping = { sources cascade: "all" }
Для источника я добавил
static mapping = { articles cascade: "all" }
Код groovy, используемый для загрузки файла yaml в БД, выглядит следующим образом
Пожалуйста, дайте мне знать, если есть другой способ сделать это, так как это может быть не лучшим решением.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) } }