Hibernate utilização

Olá pessoal.
andei lendo sobre o hibernate esses tempos e fui tentar usa-lo…

criei uma classe Categorias, uma para os métodos DAO q chamei de CategoriasDAO e outra q iria incluir um dado no banco, mapeei minha classe, criei os arquivos de configuração do hibernate e os coloquei na pasta classes do projeto.
quando rodei a aplicação recebi essa mensagem de erro:

linha 14 do CategoriasDAO:

Obrigado desde ja.

Pessoal, fiz usando netbeans algo relacionado a Automovel bem simples. mas ele deu esse erro também. não faço idéia do que possa ser.
apareceu isso no console:
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
Copying 1 file to E:\Documents and Settings\Vadio\My Documents\NetBeansProjects\MeuCarro\build\web\WEB-INF\classes
compile-single:
run-main:
12/02/2009 03:38:07 org.hibernate.cfg.Environment
INFO: Hibernate 3.2.5
12/02/2009 03:38:07 org.hibernate.cfg.Environment
INFO: hibernate.properties not found
12/02/2009 03:38:07 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : cglib
12/02/2009 03:38:07 org.hibernate.cfg.Environment
INFO: using JDK 1.4 java.sql.Timestamp handling
12/02/2009 03:38:07 org.hibernate.cfg.Configuration addClass
INFO: Reading mappings from resource: teste/Automovel.hbm.xml
12/02/2009 03:38:07 org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource: teste/Automovel.hbm.xml
12/02/2009 03:38:07 org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: teste.Automovel -> automovel
12/02/2009 03:38:07 org.hibernate.connection.UserSuppliedConnectionProvider configure
WARNING: No connection properties specified - the user must supply JDBC connections
org.hibernate.HibernateException: Hibernate Dialect must be explicitly set
at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:57)
at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:39)
at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:426)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:128)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292)
at teste.AutomovelDAO.(AutomoveisDAO.java:12)
at teste.teste.main(teste.java:17)
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

//

Bom se alguém souber me dizer oq eu posso estar fazendo de errado ou se pulei alguma etapa será de muita ajuda.

Obrigado.

vc não informou o dialeto usado pelo hibernate

<property name=“hibernate.dialect” value="" />

o value varia de acordo com o banco que esta utilizando

Pelo visto ele também não informou a conexão com o banco: URL, Driver, Login e Password.

Abraço.

Da uma olhada Aqui:
http://www.livramento.yu.com.br/Hibernate.html

Aqui também:
http://www.hibernate.org/hib_docs/v3/reference/en/html/tutorial.html

li e reli os tutoriais. mas ainda continuo com problema. felizmente não é mais da falta de propriedades.
setei tudo bunitinho e em sua devida pasta. mesmo assim os dados não estão sendo incluídos.

msg console:

po… sei q deve se algo retardado aonde estou errando.
desculpem pela grosseria mas ainda não perdi a virgindade do hibernate //rs - LOL
Aguardo sua ajuda muito obrigado.

Agora parece que o SessionFactory foi inicializado, porém, é necessário que você coloque o código que persiste a Categoria (no seu caso, o CategoriaDAO). Pode ser que você tenha esquecido de iniciar e finalizar uma transação.

E novamente dizendo: Leia bem a documentação do Hibernate, lá tem várias informações úteis (inclusive como persistir uma entidade)

realmente não iniciei uma transação (transaction) no meu código.

vou add meus códigos aqui para que vocês avaliem. infelizmente agora (hj) não poderei verificar essa documentação mas irei procurar amanhã ou mais tarde.

deletei o de categorias, mas segui o mesmo padrão com esse q praticamente copiei de um exemplo

Amigo.java

import java.io.Serializable;
import java.util.Date;

public class Amigo implements Serializable {
   private String nome;
   private String endereco;
   private String telefone;
   private String celular;
   private String email;
   private java.util.Date nascimento;

    public String getCelular() {
        return celular;
    }

    public void setCelular(String celular) {
        this.celular = celular;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public Date getNascimento() {
        return nascimento;
    }

    public void setNascimento(Date nascimento) {
        this.nascimento = nascimento;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

   public Amigo() {
   }
}

AmigoDAO.java

import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class AmigoDAO{
   private SessionFactory factory;

   public AmigoDAO() throws Exception{
       this.factory = new Configuration().addClass(Amigo.class).buildSessionFactory();
   }
   public void insert(Amigo amigo) throws Exception{
      Session session = factory.openSession();
      session.save(amigo);
      session.flush();
      session.close();
   }
   public java.util.List getList(String condicao) throws Exception{
      Session session = factory.openSession();
      List amigos = session.find(condicao);
      session.flush();
      session.close();
      return amigos;
   }
   public Amigo retrieve(String pk) throws Exception{
      Session session = factory.openSession();
      Amigo amigo = (Amigo)session.load(Amigo.class, pk);
      session.flush();
      session.close();
      return amigo;
   }
   public void delete(Amigo amigo) throws Exception{
      Session session = factory.openSession();
      session.delete(amigo);
      session.flush();
      session.close();
   }
}

TesteAmigo.java

public class TesteAmigo {

   public static void main(String[] args) throws Exception {

     try{
       Amigo amigo = new Amigo();
       amigo.setNome("seu nome");
       amigo.setEndereco("seu endereco");
       amigo.setTelefone("seu fone");
       amigo.setCelular("seu celular");
       amigo.setEmail("seu mail");
       //amigo.setNascimento("10/10/1987");

       AmigoDAO dao = new AmigoDAO();
       dao.insert(amigo);
       System.out.println("asd");

     }catch(Exception e){
       e.printStackTrace();
     }
   }
}

eu teria q iniciar minha transação no TsteAmigo certo?

Obrigado

Amigo tentar fazer isso usando o netbeans

Vamos lá Eric,

A transação deve ser controlada pela camada de serviço e NUNCA dentro do DAO, portanto, você deve fazer o controle da transação dentro da sua classe TesteAmigo.java. Porém existe um agravante ai: O SessionFactory está sendo iniciado dentro do DAO.

Eu sei que isso é apenas um teste, mas já é bom ir se acostumando com boas práticas. No caso do SessionFactory, ele é um objeto “custoso” para ser criado, assim sendo, ele deve ser criado apenas 1 vez na aplicação. No site do hibernate tem o exemplo de um HibernateUtils.java, onde o SessionFactory é criado e compartilhado com toda a aplicação http://www.hibernate.org/42.html#A11

Como você pôde perceber no seu código, o seu SessionFactory está sendo criado apenas para o AmigoDAO.java. Portanto a primeira coisa a fazer é externalizar do AmigoDAO a criação do SessionFactory. Supondo que você esteja usando o HibernateUtils, você poderia criar o objeto Session (esse não é custoso) dentro AmigoDAO assim:

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

e depois a utlização dos métodos save(), load(), find(), delete(), etc… poderia ser feita assim:

session.save(objeto);
session.flush();
session.close();

Dentro da sua camada de serviço (no seu caso AmigoTeste.java), você poderia envolver uma transação no meio da operação dos DAOs, exemplo:

public class TesteAmigo {

   public static void main(String[] args) throws Exception {

     try{
       Amigo amigo = new Amigo();
       amigo.setNome("seu nome");
       amigo.setEndereco("seu endereco");
       amigo.setTelefone("seu fone");
       amigo.setCelular("seu celular");
       amigo.setEmail("seu mail");
       //amigo.setNascimento("10/10/1987");

       AmigoDAO dao = new AmigoDAO();
       HibernateUtil.getSessionFactory().openSession().beginTransaction().begin(); //inicia a transação
       dao.insert(amigo);
       HibernateUtil.getSessionFactory().openSession().beginTransaction().commit(); //commit
       System.out.println("asd");

     }catch(Exception e){
       e.printStackTrace();
     }
   }
}

Teoricamente com essas mudanças você vai conseguir persistir o objeto, porém note que isso foi apenas um exemplo. Em uma aplicação real, você deve tratar o commit ou rollback (se ocorrer alguma exception, como por exemplo, HibernateException).

Novamente eu digo: estude bem a documentação do Hibernate, ela é bem completa e vai te dar todas as informações que você precisa. Quando tiver dúvida, procure na internet boas práticas para se trabalhar com Hibernate. No final das contas, você vai ver como o Hibernate é fantástico e a mão na roda que ele é em aplicações de médio/grande porte.

Espero ter ajudado

estou usando o netbeans

Jair Rillo Junior

Fiz da forma q voce falou e ele incluiu normalmente os dados.
então oque faltava era iniciar e aceitar a transação?
esta transação deve estar na “3a caramada” da aplicação correto?

a transação é oque manda pro banco de dados? ou esse é um tipo de persistencia?