Annotations no Hibernate só cria relacionamentos Restrict

10 respostas
J

Salve galera, to apanhando a 2 dias ja tentando fazer com que a annotation do hibernate crie automaticamente relacionamentos em cascade mais só ficam restrict, alguem poderia me ajudar segue o codigo

package br.com.strutscadastro.pessoa.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;


import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.*;
import javax.persistence.Table;

import org.hibernate.annotations.*;


import br.com.strutscadastro.animal.model.AnimalVO;

@Entity
@Table(name="pessoa")
@NamedQueries(
		value = {
				@NamedQuery(name="PessoaVO.consultaPorCodigo", query="SELECT c FROM PessoaVO c WHERE c.codigo=:codigo")				
		}
		
)

public class PessoaVO implements Serializable {
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO) 
	@Column(name="codigo")
	private Integer codigo;
	
	@Column(name="nome", nullable=true, length=50)
	private String nome;
	
	@Column(name="idade", nullable=true, length=3)
	private Short idade;
	
	@Column(name="endereco", nullable=true, length=100)
	private String endereco;
	
	@OneToMany(mappedBy = "dono", targetEntity = AnimalVO.class, fetch = FetchType.LAZY)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
	private List<AnimalVO> animais;
	
	public PessoaVO(){}
	public PessoaVO(Integer codigo){
		setCodigo(codigo);
	}
	public Integer getCodigo() {
		return codigo;
	}
	public String getNome() {
		return nome;
	}
	public Short getIdade() {
		return idade;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public void setIdade(Short idade) {
		this.idade = idade;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	
}

E:

package br.com.strutscadastro.animal.model;



import javax.persistence.*;


import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.ForeignKey;






import br.com.strutscadastro.pessoa.model.PessoaVO;

@Entity
@Table(name="animal")
@NamedQueries(
				value={
						@NamedQuery(name="AnimalVO.consultarPorCodigo", query="SELECT a FROM AnimalVO a WHERE a.codigo = :codigo")
						
				}

)
public class AnimalVO {
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO)
	@Column(name="codigo")
	private Integer codigo;
	
	@Column(name="nome", nullable=true, length=50)
	private String nome;
	
	@ManyToOne(fetch=FetchType.EAGER)
	@Cascade(org.hibernate.annotations.CascadeType.ALL)
    @ForeignKey(name="dono_id")
	private PessoaVO dono;
	
	
	@Column(name="raca", nullable=true, length=50)
	private String raca;	
	
	public Integer getCodigo() {
		return codigo;
	}
	public String getNome() {
		return nome;
	}
	public PessoaVO getDono() {
		return dono;
	}
	public String getRaca() {
		return raca;
	}
	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public void setDono(PessoaVO dono) {
		this.dono = dono;
	}
	public void setRaca(String raca) {
		this.raca = raca;
	}
	
	
}

Classe abstractDao do hibernate:

package br.com.strutscadastro.abstractdao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;

public class AbstractDAO {
	private static final SessionFactory SESSION_FACTORY;

	static {
		AnnotationConfiguration leitorXML = new AnnotationConfiguration();
		Configuration conf = leitorXML.configure("hibernate.cfg.xml");
		SESSION_FACTORY = conf.buildSessionFactory();
	}

	protected Session getSessaoAberta(){
		return this.SESSION_FACTORY.openSession();
	}

	public Integer inserir(Object obj){
		Integer codigoGerado = null;
		Transaction transacao = null;
		Session sessao = null;
		try { 
			sessao = getSessaoAberta();
			transacao = sessao.beginTransaction();
			codigoGerado = (Integer) sessao.save(obj);
			transacao.commit();
		} catch (Exception e) {
			e.printStackTrace();
			if (transacao != null) {
				transacao.rollback();
			}
			System.out.println("Erro ao tentar inserir OBJETO [" + obj+"]");
		} finally {
			if (sessao != null) {
				sessao.close();
			}
		}
		return codigoGerado;
	}

	public void alterar(Object obj){
		Transaction transacao = null;
		Session sessao = null;
		try { 
			sessao = getSessaoAberta();
			transacao = sessao.beginTransaction();
			sessao.update(obj);
			transacao.commit();
		} catch (Exception e) {
			if (transacao != null) {
				transacao.rollback();
			}

		} finally {
			if (sessao != null) {
				sessao.close();
			}
		}
	}

	public void excluir(Object obj){
		Transaction transacao = null;
		Session sessao = null;
		try {
			sessao = getSessaoAberta();
			transacao = sessao.beginTransaction();
			sessao.delete(obj);
			transacao.commit();
		} catch (Exception e) {
			if (transacao != null) {
				transacao.rollback();
			}
			e.printStackTrace();
		} finally {
			if (sessao != null) {
				sessao.close();
			}
		}
	}
}

Mais vou ver no relacionamento criado utilizando o phpmyadmin ou qualquer outro e o bendito RESTRICT ta lá…
Alguem pode dar uma luz pra resolver isso

Muito Agradecido

10 Respostas

Hebert_Coelho

E se você importar o cascade do proprio JPA? import javax.persistence.CascadeType

J

fiz a alteração e nada ainda,
no caso se vc fazer isso no seu o relacionamento fica cascade?

Hebert_Coelho

Você testou? Oq aconteceu?

J

fico restrict ainda

Hebert_Coelho

jschilling:
fico restrict ainda
Deixa eu entender melhor, qual o problema dele ficar restrict?

Oq isso implica?

J

um exemplo faz de conta que uma pessoa tem um cachorro, faz-se o model das 2 classes, sendo que vai ser uma pessoa com todos seus atributos e uma classe cachorro com um atributo pessoa para se designar que ela é o dono. Dai quando se deleta uma pessoa, automaticamente tem que se deletar o cachorro que ela pertence (efeito em cascata), o mesmo serve para alterar pois não faz sentido haver um cachorro sem ter um dono entende…
e no banco tem q estar CASCADE, a fk não pode estar RESTRICT, nem SET NULL, nem NO ACTION e sim CASCADE para garantir o funcionamento correto

Hebert_Coelho

Mas o cascade quem faz é o JPA e não o banco de dados, até onde eu sei.

Pq vc não coloca o cascade dentro do mapemaento do @OneToOne e tals e faz o teste do delete/Persist/Merge?

drsmachado

jschilling:
um exemplo faz de conta que uma pessoa tem um cachorro, faz-se o model das 2 classes, sendo que vai ser uma pessoa com todos seus atributos e uma classe cachorro com um atributo pessoa para se designar que ela é o dono. Dai quando se deleta uma pessoa, automaticamente tem que se deletar o cachorro que ela pertence (efeito em cascata), o mesmo serve para alterar pois não faz sentido haver um cachorro sem ter um dono entende…
e no banco tem q estar CASCADE, a fk não pode estar RESTRICT, nem SET NULL, nem NO ACTION e sim CASCADE para garantir o funcionamento correto

Faz de conta que este modelo está certo…

Pessoa é quem tem cachorro.
Assim, quando se deleta uma pessoa, pode-se, por orphanRemoval, deletar o cachorro.
Pois, existem pessoas que não possuem cachorros.
Aí sim o cascade fará sentido. Pois, a tabela principal será pessoa e, ao ser deletada, deverá deletar os registros atrelados à ela, no caso, o cachorro (ainda assim, o modelo não está certo. Uma pessoa pode ter N cachorros e um cachorro, N donos).

J

entaum mais no caso como ficaria as annotation do codigo pois toda as vezes que testo o codigo, cria a relação restrict, mesmo ignorando essa relação no banco e tentando deletar uma pessoa que possui um cachorro com hibernate da exception por causa dessa restricao

Esta sendo suposto que uma pessoa pode ter varios donos e um cachorro não pode ter mais de 1 dono, essa eh a regra de negocio

drsmachado

jschilling:

Esta sendo suposto que uma pessoa pode ter varios donos e um cachorro não pode ter mais de 1 dono, essa eh a regra de negocio

Você quis dizer “uma pessoa pode ter vários cachorros”.
Isso significa Pessoa N : 1 Cachorro, certo?

//annotations entity e table
public class Pessoa {
   @OneToMany(cascade=CascadeType.ALL, targetEntity=Cachorro.class)
   private List<Cachorro> dogs;
  //demais atributos
  //getters e setters
}

E

public class Cachorro{
   @ManyToOne(mappedBy="dogs")
   private Pessoa dono;
   //demais atributos
   //getters e setters
}

Acho que isso deve resolver. Não sei se esta assim o teu mapeamento.

Criado 27 de maio de 2012
Ultima resposta 29 de mai. de 2012
Respostas 10
Participantes 3