29 de nov. de 2007

Hibernate - Exemplo com Herança

> Faça uma classe de serviço que persista, recupere e atualize dados de pessoas para um escritório de advocacia. O escritório é composto por clientes, advogados e funcionários diversos. > Toda pessoa possue nome, cpf, telefone e endereço > Clientes possuem registros de atendimentos > Funcionários possuem número da carteira de trabalho, e registros de horário > Advogados possuem número da OAB e horários de atendimento hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

 <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/hibernateAdvocacia</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="show_sql">true</property>
        <property name="format_sql">true</property>

        <property name="hbm2ddl.auto">update</property>

  <mapping class="entidade.Advogado"/>
  <mapping class="entidade.Atendimento"/>
  <mapping class="entidade.Cliente"/>
  <mapping class="entidade.Funcionario"/>
  <mapping class="entidade.Horario"/>
  <mapping class="entidade.HorarioAdvogado"/>
  <mapping class="entidade.Pessoa"/>

 </session-factory>

</hibernate-configuration>

entidade.Pessoa.java
package entidade;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Pessoa implements Serializable{
 
 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;
 
 private String nome;
 
 private String cpf;
 
 private String rg;
 
 private String telefone;
 
 private String endereco;

       // gets e sets

}

entidade.Advogado.java
package entidade;

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

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;

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

@Entity
@PrimaryKeyJoinColumn(name = "advogado_id", referencedColumnName = "id")
public class Advogado extends Pessoa implements Serializable {

 private Integer nroOab;

 @OneToMany(mappedBy = "advogado",fetch=FetchType.EAGER)
 @Cascade(CascadeType.ALL)
 private List horarios;
        
        // gets e sets

}

entidade.HorarioAdvogado.java Observe que em @JoinColumn(name="advogado_id") não foi referenciado o campo "id" de pessoa e sim o campo "advogado_id", por isso está suprimido o atributo "referencedColumnName". Isso vale para as outras classes que tem relacionamento @ManyToOne()
package entidade;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
public class HorarioAdvogado {

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;
 
 @Temporal(TemporalType.TIMESTAMP)
 private Date horario;
 
 @ManyToOne()
 @JoinColumn(name="advogado_id")
 private Advogado advogado;

        //gets e sets
}

entidade.Funcionario.java
package entidade;

import java.math.BigDecimal;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
@PrimaryKeyJoinColumn(name = "funcionario_id", referencedColumnName = "id")
public class Funcionario extends Pessoa {

 private String carteiraTrabalho;

 private BigDecimal salario;
 
 @OneToMany(mappedBy="funcionario")
 private List horarios;

        // gets e sets
}

entidade.Horario.java
package entidade;

import java.util.Date;

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.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Horario {

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 private Integer id;
 
 @Temporal(TemporalType.TIMESTAMP)
 private Date hora;
 
 @ManyToOne()
 @JoinColumn(name="funcionario_id")
 private Funcionario funcionario;
     
        //gets e sets
}

entidade.Cliente.java
package entidade;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
@PrimaryKeyJoinColumn(name = "cliente_id", referencedColumnName = "id")
public class Cliente extends Pessoa {

 @OneToMany(mappedBy = "cliente")
 private List atendimentos;
    
        //gets e sets
}

entidade.Atendimento.java
package entidade;

import java.util.Date;

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.Temporal;
import javax.persistence.TemporalType;

@Entity
public class Atendimento {

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 private Integer id;

 @Temporal(TemporalType.TIMESTAMP)
 private Date dia;

 private String descricao;

 @ManyToOne()
 @JoinColumn(name = "cliente_id")
 private Cliente cliente;

        //gets e sets
}

servico.PessoaServico.java
package servico;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;

import util.HibernateUtil;
import entidade.Advogado;
import entidade.HorarioAdvogado;

public class PessoaServico {

 public static void main(String[] args) {
  PessoaServico p = new PessoaServico();
  // p.criarAdvogado();
  p.listarAdvogados();
 }

 private void listarAdvogados() {
  Session s = HibernateUtil.getSessionFactory().openSession();
  s.beginTransaction();

  Criteria c = s.createCriteria(Advogado.class);
  List advogados = c.list();
  
  for (Advogado a : advogados) {
   System.out.println(a.getNome());
   System.out.println(a.getNroOab());
   System.out.println(a.getHorarios().get(0));
  }

  s.getTransaction().commit();
  s.close();
 }

 private void criarAdvogado() {
  Advogado a = new Advogado();
  a.setCpf("123456");
  a.setEndereco("endereco");
  a.setNome("Advogado 3");
  a.setNroOab(789);
  a.setRg("783545");
  a.setTelefone("789456");

  HorarioAdvogado h = new HorarioAdvogado();
  h.setAdvogado(a);
  h.setHorario(new Date());

  a.setHorarios(new ArrayList());
  a.getHorarios().add(h);

  Session s = HibernateUtil.getSessionFactory().openSession();

  s.beginTransaction();
  s.save(a);
  s.getTransaction().commit();
  s.close();
 }

}

util.HibernateUtil.java
package util;

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

public class HibernateUtil {

 private static final SessionFactory sessionFactory;

 static {
  try {
   // Criando a SessionFactory apartir no hibernate.cfg.xml
   sessionFactory = new AnnotationConfiguration().configure()
     .buildSessionFactory();
  } catch (Throwable ex) {
   System.err.println("Não foi possivel criar a SessionFactory." + ex);
   throw new ExceptionInInitializerError(ex);
  }
 }

 public static SessionFactory getSessionFactory() {
  return sessionFactory;
 }

}

Nenhum comentário:

Google