Grails Problema GORM: l'oggetto fa riferimento a un'istanza transitoria non salvata
Domanda
Il seguente codice Grails genera la seguente eccezione quando si tenta di .save ()
l'oggetto Foo:
org.hibernate.TransientObjectException/
org.springframework.dao.InvalidDataAccessApiUsageException:
object references an unsaved transient instance -
save the transient instance before flushing: Bar
Suppongo che mi sto perdendo alcune delle semantiche GORM in connessione con il popolamento automatico degli oggetti di dominio dai parametri HTTP.
La mia domanda è semplicemente:
- Qual è il modo corretto di popolare e salvare l'oggetto Foo, senza ottenere detta eccezione?
Modello:
class Foo {
Bar bar
}
Visualizza:
<g:form id="${foo.id}">
<g:select name="foo.bar.id" from="${Bar.list()}" />
</g:form>
Controller:
class FooController {
def fooAction = {
Foo foo = new Foo(params)
foo.save()
[ foo: foo ]
}
}
Soluzione
Se 'Bar' esiste solo nel contesto di Foo, aggiungi la seguente riga a Bar.groovy
class Bar {
static belongsTo = Foo
}
Se 'Bar' viene utilizzato in un altro contesto, è possibile utilizzarlo in Foo.groovy
class Foo {
Bar bar
static mapping = {
bar cascade:'all-delete-orphan'
}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow