Duvida com Hibernate

galera , to com uma duvida :expressionless:
eis a minha situacao

vamos dizer q eu tenha varios objetos q podem ser encadeados, tipo …

   n para n                 1 para n              1 para 1

nivel <-> tabpreco ->grupo <- produto ->cor
|->tamanho

minha duvida eh … se eu encadear todas as entidades e chama-las no hibernate pelo nivel , o hibernate chama todos os objetos encadeados… isso nao vai torna a aplicacao lenta desnecessariamente nao ???

vlw gente :wink:

depende mano se ambas as colecoes estiverem com inicialização apresada isso sim
vai deixar a aplicaçao lenta. mais em caso contrario não vai tanto.
mais em certos casos onde e viavel criar cache de objetos isso pode ater ser melhorado
dependendo do que seja isso pode ter quase o mesmo desempenho se estive-se usando jdbc
no caso em que as colecoes tevesse que ser inicialidades.

opa, vlw ajinfotec, estou lendo mais um pouco sobre hibernate pra poder configura-lo corretamente e assim nao perder desenpenho :wink:

chapa uma junção de hibernate e jpa e show de bola
começa a ler sobre jpa tambem que e bem mais pratico
mapear as entidades com annotation do jpa que os xml
e sem contar que voce não vai ter os arquivos xml no seu
projeto tudo fica na declaração da classe.

ai um exemplo de jpa.


import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author antoniel
 */
@Entity
@Table(name = "pessoas")
@Inheritance(strategy=InheritanceType.JOINED)
public class Pessoa implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id_pessoa")
    private Integer idPessoa;
    @Column(name = "nome")
    private String nome;
    @Column(name = "nome_fantasia")
    private String nomeFantasia;
    @Column(name = "foto")
    private byte[] foto;
    @Column(name = "data_cadastro")
    @Temporal(TemporalType.DATE)
    private Date dataCadastro;
    @Column(name = "ativo")
    private Boolean ativo;    
    @JoinColumn(name = "id_contato", referencedColumnName = "id_contato")
    @ManyToOne(cascade=CascadeType.ALL)
    private Contato contato;
    @JoinColumn(name = "id_endereco", referencedColumnName = "id_endereco")
    @ManyToOne(cascade=CascadeType.ALL)
    private Endereco endereco;

    ...

}

Interessante, usei a configuração automática do netbeans para o hibernate…
Nele preciso gerar além do hibernate.cfg.xml…
a hibernate.reveng.xml
a hibernateUtil.java
a classegetandset.java
a classe.hbm.xml.

No caso se for usar JPA vou precisar gerar somente:

hibernate.cfg.xml
hibernate.reveng.xml
hibernateUtil.java
classegetandset.java com annotations.

???
está certo isso???
Obrigado!!!

certo e isso ai.

eu so crio o hibernate.cfg.xml
não uso o hibernate.reveng.xml
e nem a HibernateUtil.java
trabalho de outra forma para obter
uma session.

primeiro crio um DAOImpl que implementa a minha intefeice DAO
e depois o crio DAO de cada objeto.

public abstract class DAOImpl implements DAO {

    static {
        System.out.println("inicializando");
        try {

        factory = new AnnotationConfiguration().configure()
                
                      .addAnnotatedClass(PessoaFisica.class)
                      .addAnnotatedClass(Funcionario.class)
                      .addAnnotatedClass(Endereco.class)
                      .addAnnotatedClass(Pessoa.class)
                      .addAnnotatedClass(Contato.class)

                      .buildSessionFactory();

        System.out.println("inicializado");
        
        } catch(HibernateException he) {
            he.printStackTrace();
        }
    }

    public DAOImpl() {                
    }

    public void open() throws HibernateException{

        session = factory.openSession();
        transaction = session.beginTransaction();

    }

    public void close() throws HibernateException{

        if (transaction != null) {
            transaction.commit();
        }
        
        if (session != null) {
            session.close();
        }

    }

    public void saveObject(Object o) throws HibernateException {
        open();
        session.save(o);
        close();
    }

    public void deleteObject(Object o) throws HibernateException {
        open();
        session.delete(o);
        close();
    }

    public void updateObject(Object o) throws HibernateException {
        open();
        session.update(o);
        close();
    }


    protected static SessionFactory factory;
    protected Session session;
    protected Transaction transaction;
           
}

ai um exemplo do objeto de DAO(Data access Object) da entidade Funcionario
que herda de DAOImpl e implementa a intefeice FuncionarioDAO.

public class FuncionarioDAOImpl extends DAOImpl implements FuncionarioDAO{

    public void save(Funcionario f) throws HibernateException {
        saveObject(f);
    }

    public void delete(Funcionario f) throws HibernateException {
        deleteObject(f);
    }

    public void update(Funcionario f) throws HibernateException {
        updateObject(f);
    }

    public List<Funcionario> findAll() throws HibernateException {

        open();
        Criteria criteria = session.createCriteria(Funcionario.class);
        criteria.addOrder(Order.asc("idPessoa"));
        List<Funcionario> funcionarios = criteria.list();        
        close();

        return funcionarios;
    }

    public List<Funcionario> findByIdFuncionario(Integer idFuncionario) throws HibernateException {
        open();

        Criteria criteria = session.createCriteria(Funcionario.class);
        criteria.add(Restrictions.eq("idPessoa", idFuncionario));
        criteria.addOrder(Order.asc("idPessoa"));

        List<Funcionario> funcionarios = criteria.list();
        close();

        return funcionarios;
    }

    public List<Funcionario> findByNome(String nome) throws HibernateException {
        open();

        Criteria criteria = session.createCriteria(Funcionario.class);
        criteria.add(Restrictions.like("nome", nome));
        criteria.addOrder(Order.asc("idPessoa"));

        List<Funcionario> funcionarios = criteria.list();
        close();

        return funcionarios;
    }

    public List<Funcionario> findByBairro(String bairro) throws HibernateException {
        return like0("bairro",bairro);
    }

    public List<Funcionario> findByTelefone(String telefone) throws HibernateException {
        return like1("telefone",telefone);
    }

    public List<Funcionario> findByCelular(String celular) throws HibernateException {
        return like1("celular",celular);
    }

    public List<Funcionario> findByRua(String rua) throws HibernateException {
        return like0("rua",rua);
    }


    private List<Funcionario> like0(String propriedade,Object value) throws HibernateException {
        open();

        Criteria criteria = session.createCriteria(Funcionario.class);

        criteria.createCriteria("endereco")
                .add(Restrictions.like(propriedade, value));

        criteria.addOrder(Order.asc("idPessoa"));

        List<Funcionario> funcionarios = criteria.list();
        close();

        return funcionarios;
    }


    private List<Funcionario> like1(String propriedade, Object value) throws HibernateException {
        open();

        Criteria criteria = session.createCriteria(Funcionario.class);

        criteria.createCriteria("contato")
                .add(Restrictions.like(propriedade, value));

        criteria.addOrder(Order.asc("idPessoa"));

        List<Funcionario> funcionarios = criteria.list();
        close();

        return funcionarios;
    }


    
}

ai o codigo das intefeices DAO e FuncionarioDAO.

public interface DAO {

    public abstract void open() throws HibernateException;
    public abstract void close() throws HibernateException;

    public abstract void saveObject(Object o) throws HibernateException;
    public abstract void deleteObject(Object o) throws HibernateException;
    public abstract void updateObject(Object o) throws HibernateException;

}
public interface FuncionarioDAO extends DAO{

    public abstract void save(Funcionario f) throws HibernateException;
    public abstract void delete(Funcionario f) throws HibernateException;
    public abstract void update(Funcionario f)  throws HibernateException;

    public abstract List<Funcionario> findAll() throws HibernateException;
    public abstract List<Funcionario> findByIdFuncionario(Integer idFuncionario) throws HibernateException;
    public abstract List<Funcionario> findByNome(String nome) throws HibernateException;
    public abstract List<Funcionario> findByBairro(String bairro) throws HibernateException;
    public abstract List<Funcionario> findByTelefone(String telefone) throws HibernateException;
    public abstract List<Funcionario> findByCelular(String celular) throws HibernateException;
    public abstract List<Funcionario> findByRua(String rua) throws HibernateException;    


}