Tenho o seguinte mapeamento:
public class Venda
{
...
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="endereco_entrega")
private EnderecoEntrega enderecoEntrega;
...
}
public class EnderecoCobranca
{
private String nome;
private String logradouro;
...
//Não tem o relacionamento com a venda. Esta mapeada somente no lado da venda.
}
O relacionamento está mapeado somente na parte da venda, pois posso usar esse endereço de entrega em outras entidades do sistema.
O problema acontece quando eu tenho um endereço de cobrança vinculado com a venda.
Se ocorre uma alteração na venda, para usar o mesmo endereço de entrega que o principal do cliente. A propriedade endereco_entrega fica NULL na tabela de vendas e o endereco de cobrança que estava vinculando anteriormente fica “perdido” no banco de dados.
Como eu poderia fazer para excluir esse endereço de cobrança ao mudar a propriedade do pedido para NULL?
Tentei usar orphanRemoval no mapeamento, mas ocorre o seguinte erro: (provavelmente porque atribui um valor nulo ao campo)
[quote]Caused by: java.lang.NullPointerException
at org.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:255)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:232)
at org.hibernate.engine.Cascade.cascade(Cascade.java:161)
at org.hibernate.engine.Cascade.cascade(Cascade.java:127)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:677)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:669)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:665)
…
… 25 more[/quote]
Poderia verificar ao salvar o pedido se tinha um valor diferente vinculado antes, se tivesse pegava o código e excluia. Mas, com isso perderia um pouco de perfomance.
Alguma outra ideia?