Problemas com relacionamento hasOne
27/09/2013 23:06
0
Pessoal, gostaria de uma ajuda.
Estou com 3 classes modelo (Cliente, Endereco e Entrega)
Onde um endereco deve possuir ou um Cliente ou uma Entrega.
Logo eu tenho(obrigatoriamente) q salvar um Cliente com um endereço ou uma entrega com um endereco(sem ou com cliente).

O problema é que quando salvo uma Entrega, o sistema solicita um Endereco (esperado e correto). Mas quando eu tento salvar um Cliente, com o relacionamento atual, esta sendo solicitado uma Entrega (o que não era para acontecer).

Modelos:

Entregas.Groovy

class Entregas {

static hasMany = [pedidos:Pedidos]

static hasOne = [endereco:Enderecos]
Funcionario funcionario
Cliente cliente
EstadoEntregaEnum situacaoEntrega
Date dtEntrega
Date dtSolicitacao
double total = 0


static constraints = {
funcionario nullable:false
dtEntrega nullable:true
dtSolicitacao nullable:true
cliente nullable:true
situacaoEntrega nullable:false
}


Cliente.groovy

class Cliente extends Pessoas{

static hasMany = [entregas:Entregas]
String email

static constraints = {
email nullable:false
}
}

Pessoas.groovy

abstract class Pessoas {
String nome
String sobrenome
String celular
Enderecos endereco

static constraints = {
nome blank:false, nullable:false, size:3..30
sobrenome blank:false, nullable:false, size:3..30
celular blank:false
endereco nullable:true
}
}

Enderecos.groovy

class Enderecos {

static belongsTo= [entrega:Entregas, pessoa:Pessoas]
String cidade
EstadoEnum estado
String bairro
String rua
String complemento
String referencia
String cep
Float latitude = null
Float longitude = null


static constraints = {
cidade blank:false, nullable:false
estado blank:false, nullable:false
bairro blank:false, nullable:false
rua blank:false, nullable:false
cep blank:false, nullable:false
latitude blank:true, nullable:true
longitude blank:true, nullable:true
entrega(nullable: true, validator: {field, inst -> inst.pessoa || field})
pessoa(nullable: true)
}
}
Tags: hasOne custom validation


0
Resolvi o poblema criando uma classe endreco (abstrata) e duas classes que a implementam EnderecoResidencia e EnderecoEntrega onde cada uma possui um relacionamento belongsTo. para cada uma das classes.
Sei que existe uma forma mais bonita que seria implementando o constraints.
Mas fiz várias tentativas e desisti por falta de tempo.
Se alguém souber por favo poste aqui.
Minha última tentativa foi esta abaixo:

entrega(nullable: true, validator: {field, inst -> inst.pessoa || field})
pessoa(nullable: true, validator: {field, inst -> inst.entrega || field})

28/09/2013 13:23


0
outras tentativas foram
1

entrega(nullable: true, validator: {field, inst -> inst.pessoa || field})
pessoa(nullable: true, validator: {field, inst -> inst.entrega || field})

2

entrega (nullable: true, validator: {val, obj-> if (!val && !obj.pessoa) return 'modelo.nao.associado'})
pessoa (nullable: true, validator: {val, obj-> if (!val && !obj.entrega) return 'modelo.nao.associado'})


3

entrega (nullable: true, validator: {val, obj-> if ((val==null) && (obj.pessoa==null)) return 'modelo.nao.associado'})
pessoa (nullable: true, validator: {val, obj-> if ((val==null) && (obj.entrega==null)) return 'modelo.nao.associado'})
28/09/2013 13:28



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto