Estou trabalhando em um sistema legado, e nele tenho um relacionamento Cliente x Endereço, onde no endereço é armazenado o código do cliente (CD_CLIENTE na base) e no cliente tenho um relacionamento para endereço, conforme mostrarei abaixo.
A questão é que quando vou salvar o cliente, ocorre um erro de constraint na base na tabela de endereço dizendo que CD_CLIENTE está vazio, minha dúvida é: O CD_CLIENTE não deveria ser salvo automaticamente quando eu salvo um cliente?
Faça um teste, coloque na mão um ID! Se salvar sem erro pode ser que a sequence não foi criada
insonix
Verifiquei na base apenas para desencargo, a sequence está criada.
Já temos mais de 1500 clientes cadastrados na base.
Está estranho isto, creio que ao salvar o cliente, o id deveria ser replicado automaticamente para o endereco.
Obrigado!
thiagocg
Sei que são meio ingenuas as perguntas mas:
1º. Vc esta setando o endereço no cliente?
2º. Esta persistindo primeiro o cliente antes do endereço?
3º. Ja tentou trocar o cascade do mapeamento de cliente de all para persist?
[]'s
ralphsilver
Mas vc não está setando a sequence no cd_Cliente…
vc está setando a sequence em uma coluna que chama PKCLI
ralphsilver
outra coisa:
Você colocou em sua relação que um endereço tem um ou vários clientes. Nessas condições, vc tem que persistir o endereço primeiro.
insonix
Respondendo as duas ultimas respostas.
A sequence está setada para o ID da entidade, no caso o pkCli, então ele não deveria buscar automaticamente?
Quanto a questão do relacionamento, o Cliente está one-to-many (um cliente, varios enderecos), e no Endereco está many-to-one (varios enderecos, um cliente), está correto acredito, ou não?
Obrigado amigos!
insonix
thiagocg:
Sei que são meio ingenuas as perguntas mas:
1º. Vc esta setando o endereço no cliente?
2º. Esta persistindo primeiro o cliente antes do endereço?
3º. Ja tentou trocar o cascade do mapeamento de cliente de all para persist?
[]'s
1 - sim
2 - eu persisto apenas o cliente
3 - vou fazer o teste agora
hehe
valeu cara!
Obrigado!
ralphsilver
hummm… entendi…
Estou meio enferrujado com xml… mas de uma coisa eu sei… nada está populando o cd_cliente porque não há sequence nem nada atrelada a ele… e outra: vc não tinha que popular a coluna cd cliente na entidade do endereço?
insonix
A coluna CD_CLIENTE está na base na tabela ENDERECO, apenas não está mapeada.
Ela está sendo populada, antes era feito a população manual deste campo, agora não mais, pois ao salvar um cliente novo ainda não tenho o pkcli dele…
Entende o problema?
Tenho um cliente novo, com enderecos, quero que ao salvar apenas o cliente, ele ja salve tudo e associe corretamente o endereco ao cliente.
Abraço.
ralphsilver
tente fazer o seguinte:
quando vc for popular um cliente com os endereços, na entidade do endereço ...seta o cliente nele também... por exemplo:
vc deve ter algo assim:
public class cliente {
private List<Endereco> endereco = null;
}
public class Endereco{
private Cliente cliente = null;
}
nos objetos da classe endereco... sete o cliente no método setCliente(cliente) também....
insonix
Matasse a charada!
Eu achando que o problema estava no mapeamento, mas na verdade o inverse do cliente para endereço não estava sendo setado!
Resolvido!
Obrigado!
ralphsilver
heheheh… eu já tive esse problema também…
Foi mal no começo a minha ignorancia… mas é que já faz anos que ue não utilizo o hibernate com xml… daí eu demorei um pouco para pegar no tranco… experimente usar annotations… é mais fácil de desenvolver… utilizar xml dá bastante trabalho braçal, bem mais que annotations