Mapeamento Um para Muitos em Hibernate com JPA

Mapeamento Um para Muitos em Hibernate com JPA

O exemplo abaixo descreve o mapeamento 1 para N no hibernate.
A lista das bibliotecas (arquivos .jar) do Oracle, Hibernate e Servlet 3.0 necessários são:

antlr-2.7.6.jar commons-fileupload-1.0.jar jakarta-oro.jar
asm-attrs.jar commons-lang-2.1.jar javaee.jar
asm.jar commons-logging-1.1.1.jar jstl-1.1.0.jar
c3p0-0.9.0.jar commons-validator.jar jstl.jar
cglib-2.1.3.jar dom4j-1.6.1.jar jta.jar
commons-beanutils-1.8.0.jar ejb3-persistence.jar log4j-1.2.15.jar
commons-codec-1.3.jar hibernate-annotations.jar ojdbc14.jar
commons-collections-3.2.1.jar hibernate-commons-annotations.jar oro-2.0.8.jar
commons-digester-2.0.jar hibernate3.jar servlet-api.jar
commons-el-1.0.jar hsqldb.jar standard.jar

Arquivos de Configuração do Hibernate

oracle_hibernate_cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
  
    <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
    <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
    <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:XE</property>
    <!-- Usuario do banco de dados, exemplo system -->
    <property name="hibernate.connection.username">usuario</property>

    <!-- Senha do Usuario do banco de dados  -->    
    <property name="hibernate.connection.password">senha</property>
    
    <!-- Mostra todo o codigo sql no console -->
    <property name="hibernate.show_sql">true</property>
    
    <!-- Mostra o sql formatado no console -->
    <property name="hibernate.format_sql">true</property>
    
    <!-- Classes da Aplicação Mapeadas -->
    <mapping class="entity.Venda"/>
    <mapping class="entity.Produto"/>
    
  </session-factory>
</hibernate-configuration>    

HibernateUtil.java

package persistence;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

// Função para abrir a conexao com o banco de dados
public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            
            sessionFactory = new AnnotationConfiguration().
            		configure("config/oracle_hibernate.cfg.xml").buildSessionFactory();
        } catch (Throwable ex) {
            
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}    

Classes mapeadas no Hibernate com relacionamento 1 para muitos.

package entity;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

@Entity
@SequenceGenerator(name="seqEquipe", sequenceName="seqEquipe")
public class Equipe {
	
	@Id
	@GeneratedValue(generator="seqEquipe")
	private Integer idEquipe;
	
	@Column(length=50)
	private String nomeEquipe;
	
	@OneToMany(mappedBy="equipe", fetch=FetchType.EAGER)	
	private List listaJorgador;
	
	public Equipe() {
		// TODO Auto-generated constructor stub
	}

	public Equipe(Integer idEquipe, String nomeEquipe) {
		super();
		this.idEquipe = idEquipe;
		this.nomeEquipe = nomeEquipe;
	}

	@Override
	public String toString() {
		return "Equipe [idEquipe=" + idEquipe + ", nomeEquipe=" + nomeEquipe
				+ "]";
	}

	public Integer getIdEquipe() {
		return idEquipe;
	}
	public void setIdEquipe(Integer idEquipe) {
		this.idEquipe = idEquipe;
	}
	public String getNomeEquipe() {
		return nomeEquipe;
	}
	public void setNomeEquipe(String nomeEquipe) {
		this.nomeEquipe = nomeEquipe;
	}
	public List getListaJorgador() {
		return listaJorgador;
	}
	public void setListaJorgador(List listaJorgador) {
		this.listaJorgador = listaJorgador;
	}
}    
package entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;

@Entity
@SequenceGenerator(name="seqJogador",sequenceName="seqJogador")
public class Jogador {
	
	@Id
	@GeneratedValue(generator="seqJogador")
	private Integer idJogador;
	
	@Column(length=50)
	private String nomeJogador;
	
	@ManyToOne
	@JoinColumn(name="id_Equipe")
	private Equipe equipe;
	
	
	public Jogador() {
		// TODO Auto-generated constructor stub
	}

	public Jogador(Integer idJogador, String nomeJogador) {
		super();
		this.idJogador = idJogador;
		this.nomeJogador = nomeJogador;		
	}

	@Override
	public String toString() {
		return "Jogador [idJogador=" + idJogador + ", nomeJogador="
				+ nomeJogador + "]";
	}

	public Integer getIdJogador() {
		return idJogador;
	}
	public void setIdJogador(Integer idJogador) {
		this.idJogador = idJogador;
	}
	public String getNomeJogador() {
		return nomeJogador;
	}
	public void setNomeJogador(String nomeJogador) {
		this.nomeJogador = nomeJogador;
	}
	public Equipe getEquipe() {
		return equipe;
	}
	public void setEquipe(Equipe equipe) {
		this.equipe = equipe;
	}
}    

Executando o Main

Classe para executar automaticamente o script do banco de dados baseado no mapeamento feito nas classes.

package config;

import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

// Classe para gerar o banco de dados apartir do mapeamento das classe no oracle_hibernate.cfg.xml

public class Main {
	
	public static void main(String[] args) {		
		Configuration cfg = new AnnotationConfiguration().configure("config/oracle_hibernate.cfg.xml");
		new SchemaExport(cfg).create(true, true);		
	}
}    

Classes que possuem os métodos referentes ao CRUD.

package persistence;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Equipe;

public class EquipeDao {
	
	Session session;
	Transaction transaction;
	Criteria criteria;
	Query query;
	
	
	public void create(Equipe e) throws Exception{		
		session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
				session.save(e);
			transaction.commit();
		session.close();		
	}

	public void delete(Equipe e) throws Exception{		
		session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
				session.delete(e);
			transaction.commit();
		session.close();		
	}
	
	public void update(Equipe e) throws Exception{		
		session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
				session.update(e);
			transaction.commit();
		session.close();		
	}
	
	public List findAll(){		
		session = HibernateUtil.getSessionFactory().openSession();
			List lista = session.createQuery("from Equipe").list();
		session.close();
		return lista;
	}
	
	public Equipe findByCod(Integer cod){		
		session = HibernateUtil.getSessionFactory().openSession();
			Equipe equipe = (Equipe) session.get(Equipe.class, cod);
		session.close();
		return equipe;
	}
}    
package persistence;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import entity.Jogador;

public class JogadorDao {

	Session session;
	Transaction transaction;
	Criteria criteria;
	Query query;
	
	
	public void create(Jogador j) throws Exception{		
		session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
				session.save(j);
			transaction.commit();
		session.close();		
	}

	public void delete(Jogador j) throws Exception{		
		session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
				session.delete(j);
			transaction.commit();
		session.close();		
	}
	
	public void update(Jogador j) throws Exception{		
		session = HibernateUtil.getSessionFactory().openSession();
			transaction = session.beginTransaction();
				session.update(j);
			transaction.commit();
		session.close();		
	}
	
	public List findAll(){		
		session = HibernateUtil.getSessionFactory().openSession();
			List lista = session.createQuery("from Jogador").list();
		session.close();
		return lista;
	}
	
	public Jogador findByCod(Integer cod){		
		session = HibernateUtil.getSessionFactory().openSession();
			Jogador jogador = (Jogador) session.get(Jogador.class, cod);
		session.close();
		return jogador;
	}
}    

Executando no método main

package main;

import persistence.EquipeDao;
import persistence.JogadorDao;
import entity.Equipe;
import entity.Jogador;

public class Main {

	public static void main(String[] args) {
		
		Equipe e = new Equipe(null,"Equipe A");
		
		Jogador j1 = new Jogador(null, "Jogador A");
		Jogador j2 = new Jogador(null, "Jogador B");
		
		try {
	
			//Cadastrar a equipe
			new EquipeDao().create(e);
			
			//Buscar a Equipe que foi cadastrada 
			Equipe e1 = new EquipeDao().findByCod(1);
			
			j1.setEquipe(e1);
			j2.setEquipe(e1);
			
			new JogadorDao().create(j1);
			new JogadorDao().create(j2);
			
			for(Equipe e2 : new EquipeDao().findAll()){
				System.out.println(" Equipe: " + e2);
				
				for(Jogador j3 : e2.getListaJorgador()){
					System.out.println("Jogadores :" + j3);
				}				
			}	
		} catch (Exception ex) {
			System.out.println("Error " + ex.getMessage());
		}
	}
}