Hibernate

se eu tiver um relacionamento many-to-many entre Pessoa e Veiculo,
entao eu tenho um Set veiculos na classe Pessoa.
a tabela que contem as chaves de Pessoa e Veiculo é a PessoaVeiculo(codPessoa,codVeiculo) por exemplo…

// em Pessoa tem por exemplo:
<set name="veiculos" table="PessoaVeiculo">
        <key column="codigoPessoa"/>
         <many-to-many class="net.wasys.model.VeiculoVO"    column="codigoVeiculo"/>
</set>	

bem, eu crio uma Pessoa, Veiculo, preencho o Set veiculos em Pessoa, até aí blz. Ele salvar tudo normal nas três tabelas…

depois para alterar eu faço um update em Pessoa.

a pergunta é: se o “Set Veiculos” estiver com o valor null no update o que deve acontecer?

percebi que no Oracle ele deleta todos os registros na tabela que faz o relacionamento (PessoaVeiculo)… está certo?

no DB2 isto não acontece… e acho que é o certo!

a quem puder ajudar…

obrigado.

se o set estiver null, é por que a pessoa não tem veiculo nenhum, então a tabela deve ser limpa mesmo, se isto não ocorre no DB2 tem algum problema :slight_smile:

deixa eu explicar melhor…

estou usando o Struts, então tem um formulário onde eu altero os dados da tabela pessoa. No formulário eu altero o nome,fone,email,etc.
Mas eu não mecho no “Set veiculos”, eu nem sequer mostro no formulário… isto significa que ele fica null na Form (mas na base existe, eu só não mostro no JSP)

quando eu dou um Submit, na Action eu recupero os dados da form que crio uma “PessoaVO” que contém os dados que foi digitado no formulário (nome,fone,email), mas o “Set veiculos” fica null (pois nao coloquei nada no jsp para preencher isto).

então faço update! ele apaga os relacionamentos!

deve mesmo acontecer isto?

é que é o seguinte, para resolver isto eu preciso antes fazer um “session.load”… mas aí são duas operações load e depois update…

obrigado

deixa eu complementar a pergunta:

antes de alterar session.update(…), precisa fazer um session.load(…) ?

desta maneira funciona, mas ele preenche todo o Set veiculos … numa base grande isto é ruim…

tradicionalmente precisa-se fazer: “update bla bla bla where id=?”, não precisa fazer select antes!

:?:

o problema é que o funcionamento correto é exatamente este, ele tem que salvar os campso que estão diferentes do que tem no banco, por isto se tu ta passando para ele algo com null no campo veiculos ele tem que apagar os relacionamentos mesmo

a solução mais facil para isto, seria criar um outro objeto (uma outra view deste objeto) mapeado para a mesma tabela, só que sem o campo veiculos :slight_smile:

provavelmente um parent de pessoa

public class PessoaVO{
private String nome; 
...
}

public class Pessoa extends PessoaVO {
 public Collection veiculos;
...
}

[quote=“urubatan”]a solução mais facil para isto, seria criar um outro objeto (uma outra view deste objeto) mapeado para a mesma tabela, só que sem o campo veiculos :slight_smile:

provavelmente um parent de pessoa

[code]
public class PessoaVO{
private String nome;

}

public class Pessoa extends PessoaVO {
public Collection veiculos;

}
[/code][/quote]

boa dica esta de fazer herança :smiley:

com relação ao que falei do DB2, eu vacilei :oops: o comportamento é o mesmo, acabei de testar.

obrigado urubatan