Загрузка Горма из ЯМЛА с ассоциациями


Итак, у меня есть 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 Articles.

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 2

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)
    }
}
Пожалуйста, дайте мне знать, если есть другой способ сделать это, так как это может быть не лучшим решением.