Não está dando delete no @OneToMany na remoção do relacionamento!

9 respostas
P

Pessoal,

Tenho duas classes

Sistema e DivisoesSistema

Sistema tem uma lista de divisõesSistema

@OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="ID_SIST_FK") public List<DivisaoSistema> getDivisoesSistema() { return this.divisoesSistema; }

DivisoesSistema tem um long que é o ID_SIST_FK

@Column(name="DIVIS") public String getDivisao() { return divisao; }

No banco são duas tabelas
Sistema e DivisaoSistema,
DivisaoSistema tem uma FK para Sistema que é o ID_SIST_FK e Sistema não tem nenhum relacionamento com DivisaoSistema.

Meu problema é seguinte,
quando tento excluir alguma DivisaoSistema da lista de divisoesSistema na classe Sistema, ao invés dele fazer um DELETE no registro no banco,
ele faz update na tabela DivisaoSistema setando o ID_SIST_FK como null,
como eu faço para ele excluir, tipo delete-orphan?

Tentei colocar esse annotation que achei na net

@org.hibernate.annotations.Cascade (value=org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

Mas não resolveu, alguém pode me ajudar?

Abs,
Pablo

9 Respostas

vegetasw

Não seria: “all-delete-orphan”?

P

no annotation não tem mais essa opção, somente all ou delete-orphan

F

Encontrei o mesmo problema, alguém encontrou uma solução ? Eu alterei a coluna da tabela para null pois depois que faz o update o hibernate faz o delete das entidades órfas. O problema é que o banco de dados fica sem integridade.

Se alguém puder ajudar posta aí…

Valeu

acdesouza

Na classe Sistema:

@Entity public class Sistema { //[...] @OneToMany(cascade=CascadeType.ALL, mappedBy="divisao") @JoinColumn(name="ID_SIST_FK") private List<DivisaoSistema> divisoesSistema; //[...] }

Na classe DivisaoSistema:

@Entity public class DivisaoSistema { //[...] @ManyToOne(optional=false) @Column(name="DIVIS") private Sistema divisao; //[...] }

Não acredito que precise colocar a anotação no atributo, tenta primeiro colocando no método, mesmo. Caso não funcione tente no atributo, mas acho pouco provável que faça diferença neste caso.

F

Existe alguma forma de fazer sem ter que adicionar @ManyToOne na classe DivisaoSistema ?

ex.

@Entity public class DivisaoSistema { //[...] @Column(name="DIVIS") private Integer idSistema; //[...] }

acdesouza

Não que eu saiba. Mas qual o problema que você está vendo em adicionar o Sistema na classe DivisaoSistema?

F

Se não utilizar @ManyToOne quando carregar a classe DivisaoSistema não preciso carregar a classe Sistema.

Consegui fazer assim Classe: DisciplinaCurriculo
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
	@Cascade(value={org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
	@JoinColumn(name="id_disciplina_curriculo")
	@MapKey(name="idDisciplina")
	public Map<Integer, IntegridadePrEqRp> getIntegridadePrEqRp() {
		return integridadePrEqRpItens;
	}

	public void setIntegridadePrEqRp(Map<Integer, IntegridadePrEqRp> integridadePrEqRpItens) {
		this.integridadePrEqRpItens = integridadePrEqRpItens;
	}
Classe: IntegridadePrEqRp
@Column(name = "id_disciplina_curriculo", nullable = false, insertable=false, updatable=false)
	public java.lang.Integer getIdDisciplinaCurriculo() {
		return this.idDisciplinaCurriculo;
	}

	public void setIdDisciplinaCurriculo(java.lang.Integer idDisciplinaCurriculo) {
		this.idDisciplinaCurriculo = idDisciplinaCurriculo;
	}

Só que dessa forma é necessário que a coluna id_disciplina_curriculo da classe IntegridadePrEqRp aceite null. Pois o hibernate faz o update IntegridadePrEqRp id_disciplina_curriculo = null e depois faz o delete.

acdesouza

Tem certeza? É que eu tenho um sistema com as classes assim:

@Entity public class Pedido { //[...] @OneToMany(cascade=CascadeType.ALL, mappedBy="pedido") private List<PedidoMaterial> materiaisPedidos; //[...] }

E a classe PedidoMaterial que guarda os atributos da associação entre Pedido e Material.

@Entity public class PedidoMaterial { //[...] @ManyToOne(optional=false) private Pedido pedido; //[...] }

E se eu faço a consulta hql:

select pm from PedidoMaterial pm where pm.id = 13

O Hibernate gera a consulta:

select pedidomate0_.id as id8_, pedidomate0_.pedido_id as pedido6_8_, pedidomate0_.material_id as material5_8_, pedidomate0_.quantidade as quantidade8_, pedidomate0_.precoCompra as precoCom3_8_, pedidomate0_.precoVenda as precoVenda8_ from shaper.PedidoMaterial pedidomate0_ where pedidomate0_.id=13

Isto é, não faz consulta sobe o Pedido. Tem certeza de que está acontecendo isso? :?
Qual a versão do Hibernate você está usando? Não teria um fetch=FetchType.EAGER no seu @ManyToOne, perdido, por aí, não? :wink:

acdesouza

POST REPETIDO, FAVOR APAGAR

Criado 8 de maio de 2007
Ultima resposta 29 de set. de 2007
Respostas 9
Participantes 4