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

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

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

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

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

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.

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

ex.

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

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

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

Consegui fazer assim
Classe: DisciplinaCurriculo

[code] @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;
}[/code]

Classe: IntegridadePrEqRp

[code] @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;
}[/code]

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.

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:

POST REPETIDO, FAVOR APAGAR