ManyToOne desvincular registro - set null

11 respostas
R

Oi pessoal do guj, estou com uma dificuldade com jpa e venho pedir ajuda.

Tenho uma classe chamada entidade, ela tem um relacionamento com ela mesma (atributo empresa).

Não consigo desvincular uma entidade de uma empresa, quando busco a entidade no banco ela sempre vem com a empresa mesmo eu tendo setado empresa pra null e salvado. o problema é só com esse tipo de relacionamento.

estou fazendo da seguinte forma:

entidade.setEmpresa(null);
entidade.save....

classe entidade (resumida):

@Table(name = "entidades")
public class Entidade implements Serializable, CycleRecoverable {
.
.
.
private Entidade empresa;

@ManyToOne
	@JoinColumn(name = "entidade_id")
	public Entidade getEmpresa() {
		return this.empresa;
	}
}

11 Respostas

R

oi pessoal, tentei con fetchtype eager e nullable true e não mudou nada, seto a empresa pra null e nada acontece.
não sei que outra anotação ou configuração poderia ter a ver com isso, por favor me dêem uma dica do que pode ser
ou pelo menos uma direção para solucionar isso…

@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = “entidade_id”, nullable=true)

R

Tentou :

@Table(name = "entidades")
public class Entidade implements Serializable, CycleRecoverable {
.
.
.
@ManyToOne
@JoinColumn(name = "entidade_id")
private Entidade empresa;


public Entidade getEmpresa() {
	return this.empresa;
}
}

???

R

fiz o teste, mas não resolveu…

vi que no arquivo de configuração pode-se colocar a seguinte propriedade:

isso resolveu o problema de setar null, porém outros relacionamentos não estão mais sendo mais trazidos do banco.

arrumou uma coisa e estragou outra =/

alguma idéia?

R

ruffy:
fiz o teste, mas não resolveu…

vi que no arquivo de configuração pode-se colocar a seguinte propriedade:

isso resolveu o problema de setar null, porém outros relacionamentos não estão mais sendo mais trazidos do banco.

arrumou uma coisa e estragou outra =/

alguma idéia?

mas o certo é você dar um remove na lista de empresas ? por que para remover um objeto tem que remover da lista deopis dar um persist/update (hibernate)
assim ele não seta null, mas sim remove de verdade

R

o mapeamento está do lado da entidade, que tem uma empresa, não do lado da empresa, que teria uma lista de entidades.

Entidade entidade = dao.getEntidadeById(3);
entidade.setEmpresa(null);
dao.save(entidade);

se eu pegar do banco novamente depois de ter executado o código acima, a empresa não é null;

Entidade entidade = dao.getEntidadeById(3);
entidade.getEmpresa(); //não retorna nulo

não quero remover a empresa do banco, só quero que a entidade não seja mais vinculada a nenhuma empresa…

R

ruffy:
o mapeamento está do lado da entidade, que tem uma empresa, não do lado da empresa, que teria uma lista de entidades.

Entidade entidade = dao.getEntidadeById(3);
entidade.setEmpresa(null);
dao.save(entidade);

se eu pegar do banco novamente depois de ter executado o código acima, a empresa não é null;

Entidade entidade = dao.getEntidadeById(3);
entidade.getEmpresa(); //não retorna nulo

não quero remover a empresa do banco, só quero que a entidade não seja mais vinculada a nenhuma empresa…

exatamente, da no mesmo se o mapeamento fosse em qualquer uma, você não pode setar um valor nulo, você tem que criar um metodo para deletar a empresa, ai você coloca em.delete(getEmpresa);

R

ruffy:
o mapeamento está do lado da entidade, que tem uma empresa, não do lado da empresa, que teria uma lista de entidades.

Entidade entidade = dao.getEntidadeById(3);
entidade.setEmpresa(null);
dao.save(entidade);

se eu pegar do banco novamente depois de ter executado o código acima, a empresa não é null;

Entidade entidade = dao.getEntidadeById(3);
entidade.getEmpresa(); //não retorna nulo

não quero remover a empresa do banco, só quero que a entidade não seja mais vinculada a nenhuma empresa…

exatamente, da no mesmo se o mapeamento fosse em qualquer uma, você não pode setar um valor nulo, você tem que criar um metodo para deletar a empresa, ai você coloca em.delete(getEmpresa);

R

o detalhe é que eu não quero que a empresa seja deletada

R

então em vez do delete você tentou entidade.setEmpresa(new Empresa()) e depois em.update(entidade) (ou update se for hibernate) ?
assim ele salva vazio e não nulo (nulo e vazio tem diferenças)

Se não der certo, chegar em casa eu refaço seu código lá e vejo, to no trampo

R

tentei entidade.setEmpresa(null) e depois em.update(entidade), sem sucesso.

acabei fazendo com native query.

em.createNativeQuery("update entidades set entidade_id = null where id = ?")

valeu pela ajuda cara.

R

ruffy:
tentei entidade.setEmpresa(null) e depois em.update(entidade), sem sucesso.

acabei fazendo com native query.

em.createNativeQuery("update entidades set entidade_id = null where id = ?")

valeu pela ajuda cara.


é uma boa solução, mas não a melhor, mas já que solucionou seu problema :smiley:

Criado 28 de abril de 2011
Ultima resposta 29 de abr. de 2011
Respostas 11
Participantes 2