Dúvida com Hibernate Annotations e Constraints

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 hibernate-3.2.0.cr2 e o hibernate-annotations-3.2.0.cr1, ou seja, segui as dicas do site hibernate.org
http://www.hibernate.org/247.html

Tenho o seguinte código (POJO) 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.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Estado implements Serializable {

   @Id
   @GeneratedValue
   private Long id;

   @Column(length = 50)
   private String nome;

   @Column(length = 2)
   private String uf;

   @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name="pais_id")
   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;
   }
}

O hibernate esta me gerando o seguinte 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;

Mas o correto seria:

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;

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

Coloque o código da sua classe Pais.

Bom pessoal, segue o código, COM SUCESSO, da classe “pai” e “filha” (no relacionamento):

Classe PAIS

package br.com.faespsenar.sicp.model;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.validator.Length;

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Pais {
	
	@Id
	@SequenceGenerator(name = "seq_pais", sequenceName = "pais_id_seq", initialValue = 1, allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_pais")
	private Long id;

	@Length(min = 1, max = 60, message = "validator.pais")
	private String nome;

	@Length(min = 1, max = 2)
	private String sigla;

	@OneToMany(mappedBy = "pais", cascade = CascadeType.REMOVE)
	private List<Estado> estados;

	public List<Estado> getEstados() {
		return estados;
	}

	public void setEstados(List<Estado> estados) {
		this.estados = estados;
	}

	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 String getSigla() {
		return sigla;
	}

	public void setSigla(String sigla) {
		this.sigla = sigla;
	}
}

Classe ESTADO

package br.com.faespsenar.sicp.model;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;

@SuppressWarnings("serial")
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Estado implements Serializable {

	@Id
	@SequenceGenerator(name = "seq_estado", sequenceName = "estado_id_seq", initialValue = 1, allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_estado")
	private Long id;

	@Length(min = 1, max = 50)
	private String nome;

	@Length(min = 1, max = 2)
	private String uf;

	@NotNull
	@ManyToOne(cascade=CascadeType.REMOVE)
	@JoinColumn(name="pais_id")
	private Pais pais;

	@OneToMany(mappedBy = "estado", cascade = CascadeType.REMOVE)
	private List<Cidade> cidades;

	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;
	}

	protected List<Cidade> getCidades() {
		return cidades;
	}

	protected void setCidades(List<Cidade> cidades) {
		this.cidades = cidades;
	}
}

NOTA: Veja que ainda existe o relacionamento em cascata com a classe CIDADE, que segue o mesmo tipo de anotação das anteriores…

Grato,

Qual a versão do Driver JDBC? Tente usar a mais atual.

:wink:

Agradeço a ajuda de todos, mas JÁ ESTA FUNCIONANDO ! rs…rs…
Eu coloquei a solução logo acima para que todos saibam como utilizar a anotação com cascata.

Grato,

Tenho a mesma duvida nesse topico, vcs poderiam me ajudar?

http://www.guj.com.br/posts/list/0/209148.java

obrigado