Não persistir atributos da classe pai (herança)
10/08/2015 10:53
0
Olá pessoal, tudo bem?
Eu tenho uma classe chamada Pessoa. Esta classe é alimentada quando consumo um método rest. Isso funciona perfeito!
Esta classe fica na pasta sources\groovy já que a intenção não é duplicar as informações da Pessoa que fica em outro banco de dados.

Eu também possuo uma classe chamada Paciente. Esta classe seria uma herança da classe Pessoa, ou seja, ela foi criada em Domain Class. Tudo funciona bem, até não ser persistido, porém, ao salvar, dá o seguinte erro: "Cannot redirect for object [br.ufscar.deamo.Paciente : (unsaved)] it is not a domain or has no identifier. Use an explicit redirect instead . Stacktrace follows: Message: Cannot redirect for object [br.ufscar.deamo.Paciente : (unsaved)] it is not a domain or has no identifier. Use an explicit redirect instead".

[list][/list]
import org.grails.databinding.BindingFormat

abstract class Pessoa {

String nome;
String nomeSocial;
String cpf;
@BindingFormat('dd/MM/yyyy')
Date dataNascimento;
String sexo;
String estadoCivil;
String raca;
String etnia;
String nacionalidade;
String naturalidade;
String tipoSanguineo;
String emailPrincipal;
String emailAlternativo;
byte[] foto;
Integer idade;
String funcao;
Boolean vinculo;

static hasMany=['endereco':Endereco, 'necessidadeEspecial':NecessidadeEspecial,'telefone':Telefone,'filiacao':Filiacao ]

static constraints = {
}
}



[list][/list]
import org.grails.databinding.BindingFormat

class Paciente extends Pessoa implements Serializable{

String numeroSus;
@BindingFormat('dd/MM/yyyy')
Date dataObito;
Integer numeroFilhos;
Integer tempoUniao;
String observacao;

static hasMany = ['bolsa':Bolsa]

static constraints = {
dataObito(nullable: true);
numeroSus(maxSize: 15,blank: false);
numeroFilhos(nullable: true);
tempoUniao(nullable: true);
observacao(nullable: true,maxSize: 1000,blank: false)
bolsa(nullable: true);
}

static transients = ['nome', 'nomeSocial', 'dataNascimento', 'sexo', 'estadoCivil', 'raca', 'etnia', 'nacionalidade', 'naturalidade', 'tipoSanguineo', 'emailPrincipal', 'emailAlternativo', 'foto', 'idade', 'funcao', 'vinculo', 'endereco', 'necessidadeEspecial', 'telefone', 'filiacao'];

static mapping = {
id name: "cpf", generator: "assigned" 
};
}

Como eu faço para resolver isso?
Tags: Domain, Groovy Class, Herança


0
Ao que me parece você criou um especialização de Pessoa... que é Paciente.
Você tem que instanciar um objeto do tipo Paciente ...e não pessoa...pois... tudo que Pessoa tem ... Paciente também tem... além das suas particularidades.
Tento criar o tipo Paciente ... veja como se comporta.


0
Ao que me parece você criou um especialização de Pessoa... que é Paciente.
Você tem que instanciar um objeto do tipo Paciente e não pessoa...pois...
tudo que Pessoa tem Paciente também tem além das suas
particularidades.
Tenta criar o tipo Paciente, adiciona os dados e veja como se comporta ao persistir .
[correção]


0
Boa tarde!
Evandro isso eu já fiz e deu certo. Ao buscar os dados no WebService, eu crio uma instância de Paciente e os dados é inclusive mostrado em tela. O problema está na hora de salvar. Gera uma excessão. Isso porque eu não quero que os atributos de pessoa seja salvo no banco de dados, pois a intenção é ter os dados mais novos que pego através do consumo do webservice. Somente os atributos que foram criados em paciente, que deve ser persistidos.
Pelo que entendi o erro ocorre na linha redirect pacienteInstance do método save do controlador. Abaixo está o método:
@Transactional
def save(Paciente pacienteInstance) {
if (pacienteInstance == null) {
notFound()
return
}

if (pacienteInstance.hasErrors()) {
respond pacienteInstance.errors, view:'create'
return
}

pacienteInstance.save flush:true

request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [message(code: 'paciente.label', default: 'Paciente'), pacienteInstance.id])
redirect pacienteInstance
}
'*' { respond pacienteInstance, [status: CREATED] }
}
}
10/08/2015 12:12


0
Se Paciente não está em grails-app/domain, a princípio o Grails vai achar que aquilo não é um domain mesmo!
Outra coisa, pelo que entendi você está tentando desconsiderar na classe Paciente uma série de atributos oriundos da classe pai Pessoa... Se for o caso, sugiro que repense se este relacionamento realmente faz sentido no seu domínio

Se pergunte o que uma Pessoa representa no universo do seu sistema, e faça o mesmo para um Paciente.


0
Paciente está em domain, quem não está a classe Pessoa.
Paciente é uma especialização de uma Pessoa. Os dados de pessoa vem de um outro sistema e que está em outro banco de dados. Não há necessidade de duplicar, ou seja, persistir os dados de Pessoa no banco de dados aonde será persistido os dados do Paciente. Na tela aonde mostra os dados cadastrais de paciente, irá aparecer os dados da Pessoa, e só servirá para visualização.
O único dado que é duplicado, é a chave que neste caso é CPF.
10/08/2015 16:11


0
tenta isso na classe pai  (Pessoa)


static mapping = {        tablePerHierarchy false    }


0
Mesmo erro!
Cannot redirect for object [Paciente : (unsaved)] it is not a domain or has no identifier. Use an explicit redirect instead . Stacktrace follows:
Message: Cannot redirect for object [Paciente : (unsaved)] it is not a domain or has no identifier. Use an explicit redirect instead 
10/08/2015 18:11


0
Se não há necessidade de ter tais dados no seu banco de dados, estes atributos sequer deveriam existir no domínio.
Minhas sugestões: Eliminar esta herança, e não utilizar CPF como chave primária (apesar de isto não ter relação com seu problema original).


0
Magno não preciso gravar no banco aonde será salvo os dados de paciente, pois existe um outro banco de dados com os dados e o serviço sempre online.
A intenção é sempre pegar os dados atualizados do serviço e a única coisa que tenho em comum que liga o paciente a pessoa, seria o CPF.
10/08/2015 19:21


0
Por isso mesmo, Fabiano, se neste sistema você não necessita daqueles atributos, eles sequer deveriam estar presentes na classe. Quanto ao CPF, não é interessante utilizar um atributo do domínio como chave, se a intenção é apenas fazer a referencia para o outro banco de dados o CPF não precisa ser chave primária. Mas nada disso tem relação com o seu problema, creio.

Confesso que nunca vi essa construção redirect(instância), e pesquisando na documentação também não achei nada a respeito, mas olhando bem a mensagem de erro dá para ver que o objeto não foi persistido com sucesso, experimente testar o retorno do método save(), ou utilizar o parâmetro failOnError: true


1
Acho que você poderia mudar : tira essa Hierarquia!
Cria uma método que retorne os dados "Pessoa" pelo CPF do paciente... e dai vc passa isso num List para a tela junto com uma instância de Paciente.
Ja que pessoa ja vem de outro sistema atualizado... vc só precisa recuperar esse dado... não necessariamente um objeto Pessoa.



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