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.
plentz
Julho 22, 2006, 7:55pm
#2
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,
drix
Julho 24, 2006, 7:22am
#4
Qual a versão do Driver JDBC? Tente usar a mais atual.
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