Удаление из каскадного режима all-delete-orphan не работает

#hibernate #grails #grails-orm

#переход в спящий режим #grails #grails-orm

Вопрос:

Grails 1.3.7 с MySQL 5.5

Либо я, должно быть, делаю что-то безмозглое, либо это связано с проблемами Grailshttp://jira.grails.org/browse/GRAILS-5804 и http://jira.grails.org/browse/GRAILS-4121 и подобное. У меня есть:

 class Author {
    String name
    static hasMany = [books: Book]
    static constraints = {
        books cascade: 'all-delete-orphan'
    }
    String toString() {
        return name
    }
}

class Book {
    String title
    static belongsTo = [author: Author]
    static constraints = {
    }
    String toString() {
        return title
    }
}

Bootstrap:
def a = new Author(name: 'Author0')
a.save(flush: true, failOnError: true)      
def b = new Book(title: 'Book0')
a.addToBooks(b).save(flush: true, failOnError: true)

class AuthorController {
    def index = {
        println("Controller code: "   "Old books by author: "   Author.get(1).books)
        def author = Author.findByName("Author0")
        def oldBooks = []
        oldBooks  = author.books  // to avoid ConcurrentModificationException
        oldBooks.each {
            author.removeFromBooks(it)
        }
        author.save(flush: true, failOnError: true)
        println("Controller code: "   "New books by author: "   Author.get(1).books)
            render("All done!")
        }
    }
  

Но когда я перехожу к localhost: 8080 / foo / author / index, я получаю ‘свойство not-null ссылается на нулевое или временное значение: foo.Book.author’ во время сохранения ()

Я действительно не знаю GORM-internals или Hibernate (прокси- или непроксируемые экземпляры), я перепробовал все комбинации использования ‘get’ вместо ‘find’, но не могу заставить это работать. Кто-нибудь может объяснить, как это должно работать?

Ответ №1:

Я думаю, вы неправильно установили ограничение, оно должно быть таким:

 static mapping = {
    books cascade: "all-delete-orphan"
}
  

НЕ

 static constraints = {
    books cascade: 'all-delete-orphan'
}
  

Это вызывает проблему. Более подробную информацию об этих ошибках GORM можно найти здесь (Удаление дочерних элементов).

Комментарии:

1. Хм, я пробовал переключать кавычки, но это не помогло. Также пробовал переключаться на hsqldb, это тоже ничего не дало…

2. @John: на самом деле, это не цитата. Пожалуйста, обратите внимание на «статическое сопоставление = » и «статическое ограничение = …»

3. Ого! Вы, конечно, правы. Определенно в категории «мертвые мозги». Интересно, могу ли я закрыть / удалить этот вопрос из Stackoverflow — ничего не добавляет сообществу.

4. @John: Приятно слышать, что вы решаете проблему, в следующий раз я буду более конкретным. Вам не нужно беспокоиться об этом вопросе, все мы иногда совершаем ошибки.