Grails: доступ к GORM из фонового потока - PullRequest
0 голосов
/ 12 августа 2011

Я боролся с этой ошибкой уже неделю, и я серьезно схожу с ума по этому поводу! Я перепробовал множественные реализации, обходные пути и взломы, а что нет, но я просто продолжаю сталкиваться с еще одним исключением.

Я использую плагин Executor для асинхронного запуска метода:

runAsync{
   run(...)
}

Метод изначально удаляет некоторые объекты:

page.delete(flush:true)

А потом возможно воссоздать эти объекты:

def page = new Page(type : Page.TYPE_TABLE, domain : domainVersion.domain, identifier : tableName)
page.save(flush: true, failOnError: true)

Но это не так со следующим исключением:

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.ramboll.egs.ohs.domain.Domain#1]

Связь между Page и Domain просто реализуется с помощью Page, имеющего атрибут Domain. Нет hasMany og belongsTo - поскольку я был обескуражен этим в предыдущем посте из-за проблем с производительностью.

Я думаю, что перепробовал все мыслимые комбинации save, merge, withTransachtion и PersistenceContextInterceptor ...

Как это должно работать? Примеры пожалуйста.

Заранее спасибо!

1 Ответ

0 голосов
/ 12 августа 2011

Не похоже, что работа в новом потоке является проблемой, это похоже на стандартную проблему проверки.Это говорит о том, что Page имеет значение null, что указывает на ошибку проверки, поскольку save () возвращает экземпляр, если он был успешным, или null, если есть одна или несколько ошибок проверки.Есть несколько вариантов:

def page = new Page(type : Page.TYPE_TABLE,
     domain: dbUpdate.domainVersion.domain, identifier: tableName)
page.save(flush:true)
if (page.hasErrors()) {
   // handle errors
}
else {
   def pageVersion = createPageVersion(page, dbUpdate.domainVersion,
       con, tableName, dbUpdate.author).save(flush:true)
}

или используйте failOnError, чтобы вызвать исключение:

def page = new Page(type : Page.TYPE_TABLE, identifier: tableName,
     domain: dbUpdate.domainVersion.domain).save(flush:true, failOnError: true)
def pageVersion = createPageVersion(page, dbUpdate.domainVersion,
    con, tableName, dbUpdate.author).save(flush:true)
...