Dúvida sobre Hibernate (Annotations) + Integridade do Banco (Constraints)

4 respostas
softwork

Caro amigo,
Estou com um “probleminha” muito irritante, no qual não estou conseguindo gerar a contraints correta (DELETE CASCADE ou UPDATE CASCADE) no meu banco de dados (PostgreSQL) através do Hibernate.

NOTA: Estou utilizando o Hibernate3 (3.1.3) e o Hibernate-Annotation (3.2.0 CR1)

Tenho o seguinte código do meu moledo de banco:

package br.com.faespsenar.sicp.model;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.ManyToOne;

import org.hibernate.annotations.Cascade;

@Entity
public class Estado {

@Id
@GeneratedValue
private Long id;

@Column(length = 50)
private String nome;

@Column(length = 2)
private String uf;
@ManyToOne(cascade={CascadeType.REMOVE})

@Cascade(org.hibernate.annotations.CascadeType.REMOVE)

private Pais pais;
public Long getId() {

	return id;
}

public void setId(Long id) {
	this.id = id;
}

public String getNome() {
	return nome;
}

public void setNome(String nome) {
	this.nome = nome;
}

public Pais getPais() {
	return pais;
}

public void setPais(Pais pais) {
	this.pais = pais;
}

public String getUf() {
	return uf;
}

public void setUf(String uf) {
	this.uf = uf;
}

}

Obrigado por sua atenção, aguardo qualquer dica ou esclarecimento sobre o assunto.

4 Respostas

plentz

Primeira coisa:

http://www.hibernate.org/247.html

softwork

Eu agradeço sua intenção em me ajudar, mas ainda não foi o suficiente…
Cheguei a baixar a versão 3.2.0 rc2 e fazer testes, baixei também a versão Hibernate 3.2.0.cr3 e continuar os testes, mas nada!
Infelizmente não estou tendo o sucesso que espero, veja como o hibernate gerou o script da minha “entidade” (tabela):

CREATE TABLE “public”.“estado” (

“id” BIGINT NOT NULL,

“nome” VARCHAR(50),

“uf” VARCHAR(2),

“pais_id” BIGINT,

CONSTRAINT “estado_pkey” PRIMARY KEY(“id”),

CONSTRAINT “fk7c49258660bd82d” FOREIGN KEY (“pais_id”)

REFERENCES “public”.“pais”(“id”)

    ON DELETE NO ACTION

ON UPDATE NO ACTION

NOT DEFERRABLE

) WITHOUT OIDS;

O que preciso é que o hibernate gere o script com o DELETE e UPDATE em CASCADE, ou seja, o script deveria ficar desta forma:

CREATE TABLE “public”.“estado” (

“id” BIGINT NOT NULL,

“nome” VARCHAR(50),

“uf” VARCHAR(2),

“pais_id” BIGINT,

CONSTRAINT “estado_pkey” PRIMARY KEY(“id”),

CONSTRAINT “fk7c49258660bd82d” FOREIGN KEY (“pais_id”)

REFERENCES “public”.“pais”(“id”)

    ON DELETE CASCADE

ON UPDATE CASCADE

NOT DEFERRABLE

) WITHOUT OIDS;

NOTA: Eu fiz uma alteração na minha classe de modelo (POJO), conforme o exemplo citado no site do hibernate, ficando assim:

@Entity
public class Estado {

@Id
@GeneratedValue
private Long id;
:::

:::

:::



@ManyToOne(cascade=CascadeType.ALL)

@JoinColumn(name=pais_id)

private Pais pais;

:::

:::

:::

}

Ainda preciso de ajuda para este probleminha, qualquer ajuda será muito bem vinda.

Grato,

Dennys

plentz

Você já tentou fazer o debug dos sources do hibernate e verificou se ele estava realmente fazendo o cascade como você achou que devia? Pode ser inclusive algum problema do release candidate…

softwork

Opa meu amigo, após várias tentativas o problema foi solucionado.
O CASCADE realmente só funciona em @OneToOne e @OneToMany, no meu caso as minhas POJO´s estavam unidirecional @ManyToOne, então tive que implementar, com uma ajudinha importante, o @OneToMany (bidirecional) só para funcionar o CASCADE, mas tudo bem…

Grato pela atenção,

Criado 17 de julho de 2006
Ultima resposta 19 de jul. de 2006
Respostas 4
Participantes 2