Ola, bom dia!
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?
CLIENTE
<class name="br.com.sulforms.modelo.venda.Cliente" table="CLIENTE"
rowid="rowid">
<id column="PKCLI" name="pkCli" type="java.lang.Long"
unsaved-value="0">
<generator class="sequence">
<param name="sequence">SSQ_CLIENTE</param>
</generator>
</id>
<set name="enderecos" inverse="true" cascade="all"
batch-size="16" lazy="true">
<key column="CD_CLIENTE" />
<one-to-many class="br.com.sulforms.modelo.venda.Endereco" />
</set>
....
ENDEREÇO
<class name="br.com.sulforms.modelo.venda.Endereco" table="ENDERECO"
rowid="rowid">
<id column="PKEND" name="pkEnd" type="java.lang.Long"
unsaved-value="0">
<generator class="sequence">
<param name="sequence">SSQ_ENDERECO</param>
</generator>
</id>
<many-to-one name="cliente"
class="br.com.sulforms.modelo.venda.Cliente" column="CD_CLIENTE" />
....
Faça um teste, coloque na mão um ID! Se salvar sem erro pode ser que a sequence não foi criada
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!
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
Mas vc não está setando a sequence no cd_Cliente…
vc está setando a sequence em uma coluna que chama PKCLI
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.
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!
[quote=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[/quote]
1 - sim
2 - eu persisto apenas o cliente
3 - vou fazer o teste agora
hehe
valeu cara!
Obrigado!
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?
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.
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:
[code]
public class cliente {
private List endereco = null;
}
public class Endereco{
private Cliente cliente = null;
}[/code]
nos objetos da classe endereco… sete o cliente no método setCliente(cliente) também…
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!
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