Olá pessoal,
Novamente com a mesma questão porém apresentada de uma forma diferente.
Eu tenho duas classes: Customer e CustomerAddress, a relação entre essas classes é que um Customer poder ter vários CustomerAddress e um CustomerAddress deve ser estabelecido como principal para o Customer. Declarando fica basicamente assim:
No arquivo Customer.groovy no diretório domains
class Customer {
static hasMany = [ customerAddress : CustomerAddress ];
String firstName
String lastName
String email
String cpf
CustomerAddress currentAddress
String phone
Date dateCreated
Date lastUpdated
static def constraints = {
email(email:true,blank:false,unique:true)
firstName(maxSize:50,blank:false,nullable:false)
lastName(maxSize:50,blank:false,nullable:false)
currentAddress(nullable:true)
cpf(maxSize:15,nullable:false,unique:true)
}
}
Arquivo CustomerAddress.groovy também no diretório Domains
class CustomerAddress {
static belongsTo = [ customer:Customer ]
Customer customer
String address
String number
String complement
String suburb
Date dateCreated
Date lastUpdated
static def constraints = {
customer()
address(maxSize:80, blank:false, nullable:false)
number(maxSize:10, blank:false, nullable:false)
complement(maxSize:30, blank:false, nullable:false)
suburb(maxSize:30, blank:false, nullable:false)
}
}
Sendo que agora gostaria de criar num mesmo formulário, os campos para inclusão dos dados para este Cliente (Customer) e Seu endereço Default. O que eu fiz? Na action save dentro de CustomerController.groovy, criei uma ação com a seguinte codificação
def save = { RegisterCommand cmd ->
def user = new Customer(params["customer"])
def customerAddress = new CustomerAddress(params["customerAddress"])
customerAddress.customer = user
Customer.withTransaction { status ->
if(!user.hasErrors() && user.save() && !customerAddress.hasErrors() && customerAddress.save()) {
if (!user?.currentAddress) {
Customer.executeUpdate("update Customer set currentAddress=? where id = ?",[ customerAddress.id, user.id ])
}
render("OK")
}
else {
status.setRollbackOnly()
render("PROBLEMA")
}
}
}
O problema é quando a instrução:
if (!user?.currentAddress) {
Customer.executeUpdate("update Customer set currentAddress=? where id = ?",[ customerAddress.id, user.id ])
}
vai ser executada ela é simplemente ignorada e o campo currentAddress permanece nulo, causando um grande problema de relacionamento entre essas bases de dados.
Já tentei fazer via save e nada!
user.currentAddress = customerAddress.id
user.save(flush:true)
Coloquei logSql = true no dataSource e vi que o update é executado porém o campo currentAddress continua null.
Sendo assim, já não sei mais o que fazer. Alguém tem alguma dica do que pode ser isso? Será um bug do Grails?
Aguardo a ajuda dos amigos.
Abraços
Rogério