@OneToMany, dúvidas

4 respostas
D

To fazendo um relacionamento @OneToMany, eu teria que mudar alguma coisa na DAO ou em outro lugar ainda pra funcionar? é um banco que possui várias agencias.
As classes são as seguintes:

package Modelo;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "dbo.Banco")
public class Banco {
	@Id
	private int numeroBanco;
	private String nomeBanco;
	@OneToMany(targetEntity=Agencia.class ,cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "banco")   
    private List<Agencia> agencia;
	
	public Banco(){
		
	}

	public Banco(int numeroBanco, String nomeBanco, List<Agencia> agencia) {
		this.numeroBanco = numeroBanco;
		this.nomeBanco = nomeBanco;
		this.agencia = agencia;
	}
	
	public List<Agencia> getAgencia() {
		return agencia;
	}

	public void setAgencia(List<Agencia> agencia) {
		this.agencia = agencia;
	}

	public String getNomeBanco() {
		return nomeBanco;
	}
	public void setNomeBanco(String nomeBanco) {
		this.nomeBanco = nomeBanco;
	}
	
	public int getNumeroBanco() {
		return numeroBanco;
	}
	public void setNumeroBanco(int numeroBanco) {
		this.numeroBanco = numeroBanco;
	}	
	
	
}
package Modelo;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "dbo.Agencia")
public class Agencia {
	@Id
	private int numeroAgencia;
	private String cidade;
	private String estado;
	@ManyToOne()
    private Banco banco;
	
	public Agencia(){
		
	}

	public Agencia(int numeroAgencia, String cidade, String estado, Banco banco) {
		this.numeroAgencia = numeroAgencia;
		this.cidade = cidade;
		this.estado = estado;
		this.banco = banco;
	}

	public int getNumeroAgencia() {
		return numeroAgencia;
	}

	public void setNumeroAgencia(int numeroAgencia) {
		this.numeroAgencia = numeroAgencia;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Banco getBanco() {
		return banco;
	}

	public void setBanco(Banco banco) {
		this.banco = banco;
	}
}
package Hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import Modelo.Banco;

public class HibernateBanco {
	private static SessionFactory factory;
    
	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Banco.class);
		factory = cfg.buildSessionFactory();
    }
    
    public Session getSession() {
    	return factory.openSession();
    }
}
package Persistencia;

import org.hibernate.Session;

import Modelo.Banco;

public class BancoDAO {

	    private Session session;

	    public BancoDAO (Session session) {
	    	this.session = session;
	    }
	    public void salva (Banco banco) {
	    	this.session.beginTransaction();  
	        this.session.save(banco);   
	        this.session.getTransaction().commit();   
	        this.session.flush();   
	        this.session.close(); 
	    }
	    public void remove (Banco banco) {
	    	this.session.beginTransaction();
	    	this.session.delete(banco); 
	        this.session.getTransaction().commit(); 
	    	this.session.flush();
	    	this.session.close();
	    }
	    
	    public void atualiza (Banco banco) {
	    	this.session.beginTransaction();
	    	this.session.update(banco); 
	    	this.session.getTransaction().commit();
	    	this.session.flush();
	    	this.session.close();
	    }
}
package Hibernate;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import Modelo.Agencia;

public class HibernateAgencia {
private static SessionFactory factory;
    
	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Agencia.class);
		factory = cfg.buildSessionFactory();
    }
    
    public Session getSession() {
    	return factory.openSession();
    }

}
package Persistencia;

import org.hibernate.Session;
import Modelo.Agencia;

public class AgenciaDAO {
	  private Session session;

	    public AgenciaDAO (Session session) {
	    	this.session = session;
	    }
	    public void salva (Agencia agencia) {
	    	this.session.beginTransaction();  
	        this.session.save(agencia);   
	        this.session.getTransaction().commit();   
	        this.session.flush();   
	        this.session.close(); 
	    }
	    public void remove (Agencia agencia) {
	    	this.session.beginTransaction();
	    	this.session.delete(agencia); 
	        this.session.getTransaction().commit(); 
	    	this.session.flush();
	    	this.session.close();
	    }
	    
	    public void atualiza (Agencia agencia) {
	    	this.session.beginTransaction();
	    	this.session.update(agencia); 
	    	this.session.getTransaction().commit();
	    	this.session.flush();
	    	this.session.close();
	    }

Caso eu tente executar a main ele diz que o @ManyToOne não existe relação.

4 Respostas

magnocosta

Pelo que eu vi o mapeamento esta perfeito, apesar de eu nunca ter usado o aributo: targetEntity=Agencia.class.
Voce não postou sua classe main, MAS eu acredito q o erro esta acontecendo na hora de criar as tabelas.
Nunca trabalhei do modo como voce esta trabalhando, criando uma classe para gerar cada tabela do banco de dados (HibernateBanco, HibernateAgencia) .
Acredito que erro esta acontecendo pq uma tabela depende da outra não tem como o Hibernate mapear uma classe independente da outra, ou ele cria tudo o banco de dados ou ele não cria nada.
Na maneira como eu trabalho crio um arquivo Hibernate.cfg.xml e nele faço todo o mapeamento das classes que serão entidades e mando executar uma classe que gera todo o banco de dados.
Lembrando que eu utilizo anotações conforme voce apresentou no xml só informo quais são as classes entity.

Mais para a minha resposta ficar melhor aconselho voce postar a exception que esta sendo gerada e posta tambem sua classe main do projeto…

segue abaixo o Hibernate.cfg.xml e a classe que eu utilizo para gerar o banco de dados.
tenta realizar esse teste para ver se funciona.
vc entra no xml e editas as informacoes conforme indicada dentro do arquivo e manda executar a classe GerarTabelas

Espero que eu tenha tirado as suas dúvidas.

Valeu abraço !!!

Guevara

Tenta assim:

@OneToMany(targetEntity=Agencia.class ,cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "banco",orphanRemoval=true)

Pq não coloca td numa classe só?

public class HibernateUtil {

	private static SessionFactory factory;

	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Banco.class);
		cfg.addAnnotatedClass(Agencia.class);
		factory = cfg.buildSessionFactory();
	}

	public Session getSession() {
		return factory.openSession();
	}
}
D
Guevara:
Tenta assim:
@OneToMany(targetEntity=Agencia.class ,cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "banco",orphanRemoval=true)
Pq não coloca td numa classe só?
public class HibernateUtil {

	private static SessionFactory factory;

	static {
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		cfg.addAnnotatedClass(Banco.class);
		cfg.addAnnotatedClass(Agencia.class);
		factory = cfg.buildSessionFactory();
	}

	public Session getSession() {
		return factory.openSession();
	}
}

Eu não sabia que funcionava assim.
Uma outra dúvida que eu tenho, na Main, como que eu faço por exemplo pra instanciar o Banco sendo que tem uma list de Agencia no argumento?

Guevara

Veja este link, ele mostra como instanciar as classes na Main e depois persistir.
http://www.hiberbook.com/HiberBookWeb/learn.jsp?tutorial=18mappingonetomanyassociations

Criado 29 de abril de 2010
Ultima resposta 30 de abr. de 2010
Respostas 4
Participantes 3