Tratar referência quebrada com Hibernate

5 respostas
Eldius

Olá, pessoal, beleza?

Estou tendo alguns problemas aqui devido ao fato de uma entidade (tabela) autorizacao que referencia um beneficiario, um beneficiário pode ser removido mas o histórico de autorizações deve ser mantido, por isso não há referência de integridade (foreign key) entre as entidades.

O problema é que quando eu faço a busca o Hibernate lança uma exception e aborta tudo… Alguém sabe como eu posso ignorar isso e seguir em frente sem precisar remover a referência entre os objetos?

5 Respostas

drsmachado

E a propriedade nullable, está como?
Que relacionamento está utilizando?

Eldius

Opa, drsmachado, beleza?
No momento está mapeado desta forma:

@ManyToOne
	@JoinColumns({
			@JoinColumn(name = "NR_DEP", referencedColumnName = "NR_DEP", updatable = false, insertable = false),
			@JoinColumn(name = "COD_FAMILIA", referencedColumnName = "COD_FAMILIA", updatable = false, insertable = false),
			@JoinColumn(name = "COD_CONTRATO", referencedColumnName = "COD_CONTRATO", updatable = false, insertable = false),
			@JoinColumn(name = "COD_CONVENIO", referencedColumnName = "COD_CONVENIO", updatable = false, insertable = false) })
	private Beneficiario beneficiario;

Os atributos insertable e updatable estão como false pois há mais algumas referências que necessitam do atributo COD_CONVENIO.

GraveDigger

Olá,

Quando o beneficiário é removido as autorizações ficam com essa(s) coluna(s) null ? Isso atende seus requisitos? Parece que você perderá uma informação importante.

Sugiro ter uma flag para fazer uma pseudo-exclusão, apenas marcando-o como inativo ao invés de removê-lo de fato.

Caso isso não seja possível creio que setar o atributo optional, da annotation @ManyToOne para true deva resolver seu problema.

Att

Eldius

Valeu, GraveDigger, vou tentar essa opção do optional

Quanto ao funcionamento, ele mantém a referência (os atributos da autorização que referenciam o beneficiário não é alterado)…
E não posso alterar o funcionamento pois esse processo de inclusão/remoção de beneficiários é feita por um sistema que não tenho acesso e esse sistema apaga ao invés de sinalizar como inativo…

Eldius

Foi mal pela demora, só pude testar essa solução (incluir o atributo ‘optional=true’ na anotação ‘ManyToOne’) hoje pela manhã… E infelizmente ela não funcionou…
Mas ao menos consegui conversar com o pessoal e eles ficaram de rever o funcionamento do sistema que altera a base de dados.

Mas ainda assim eu gostaria de saber se há uma solução pra isso…

Criado 3 de fevereiro de 2012
Ultima resposta 14 de fev. de 2012
Respostas 5
Participantes 3