Configuração Programatica Hibernate 3

5 respostas
hlghelcio
Swing + MySql + Hibernate 3 hibernate.hbm.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.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/tremdados</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">admin</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.format_sql">true</property>
    <property name="current_session_context_class">thread</property>
    <mapping resource="Persistencia/Usuario.hbm.xml"/>
    <mapping resource="Persistencia/Cliente.hbm.xml"/>
  </session-factory>
</hibernate-configuration>
O hibernate.hbm.xml acima funciona 100%, mas se , for retirada a linha:
<property name="current_session_context_class">thread</property>
Passa a dar a seguinte exceção: ?No CurrentSessionContext configured!? Usando configuração programática ?HibernateUtil.java?
package Persistencia;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
        try {
       sessionFactory = new AnnotationConfiguration()
                    .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
                    .setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
                    .setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/tremdados")
                    .setProperty("hibernate.connection.username", "root")
                    .setProperty("hibernate.connection.password", "admin")
                    .setProperty("current_session_context_class", "thread")
                    .setProperty("hibernate.show_sql", "true")
                    .setProperty("hibernate.format_sql", "true")
//---------------- c3p0 inicio -------------------------------------------------------------------
//                    .setProperty("hibernate.c3p0.acquire_increment", "1")
//                    .setProperty("hibernate.c3p0.idle_test_period", "100")
//                    .setProperty("hibernate.c3p0.max_size", "10")
//                    .setProperty("hibernate.c3p0.max_statements", "0")
//                    .setProperty("hibernate.c3p0.min_size", "5")
//                    .setProperty("hibernate.c3p0.timeout", "100")
//---------------- c3p0 fim-------------------------------------------------------------------
                    .addResource("Persistencia/Cliente.hbm.xml")
                    .addResource("Persistencia/Usuario.hbm.xml").buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
Retorna o mesmo erro, ou seja parece que:
.setProperty("current_session_context_class", "thread")
Nâo é reconhecido

Aguem poderia me ajudar com as seguintes questões:
1) Onde estou errando ?
2) Como fazer para receber via argumento o usuário e a senha ?
3) Como usar o c3p0, porque se descomentar as linha c3p0 dá essa exceção:
Initial SessionFactory creation failed.java.lang.NoClassDefFoundError: com/mchange/v2/c3p0/DataSources
Exception in thread "main" java.lang.ExceptionInInitializerError

Grato.

5 Respostas

romarcio

Quando a aplicação é Swing ou Desktop, vc precisa usar essa configuração: <property name="current_session_context_class">thread</property>

sobre o C3P0, vc adicionou o jar dele no projeto?

hlghelcio

Romarcio, cara muito obrigado pelas dicas,

1) Realmente faltava c3p0. Jar, baixei do site http://sourceforge.net/projects/c3p0/ e vieram 3 JAR: c3p0-0.9.1.2.jar, c3p0-0.9.1.2-jdk1.3.Jar e c3p0-oracle-thin-extras-0.9.1.2.jar, instalei o c3p0-0.9.1.2.jar, e esta funcionando, o oracle-thin-extras-0.9.1.2.jar, eu desconsiderei uma vez que meu aplicativo usa MySql, mas estou em duvida sobre o c3p0-0.9.1.2-jdk1.3.Jar se ele me será necessário no futuro ? tipo quando for p/ produção ?.

2) Eu quero configurar o hibernate programaticamente, para poder mudar a configuração em tempo de execução, (mudar usuario e senha), depois de varias pesquisa achei uma propriedade que tirou o erro No CurrentSessionContext configured! mas não sei qual a influencia que isso fará em meu programa, tipo performace, segurança, etc,
.setProperty("hibernate.current_session_context_class", "org.hibernate.context.ThreadLocalSessionContext")
.setProperty("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory")
.setProperty("current_session_context_class", "thread")
veja se tem alguma fragilidade redundância ou ambigüidade em meu código porque eu to configurando meu hibernate como um macaco que repete sem saber o que esta fazendo. Obs se tirar a 1 propriedade da erro, mas se tirar as 2 ultimas não.

3) Eu ainda não descobri como passar ou pegar de uma tela de login o usuário e senha na hora de fabricar a sessão.

Segue minha classe HibernateUtil .java
package Persistencia;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
public class HibernateUtil {
    private static final SessionFactory sessionFactory;
    static {
        try {
            sessionFactory = new AnnotationConfiguration()
            .setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect")
            .setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver")
            .setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/Banco")
            .setProperty("hibernate.connection.username", "root")
            .setProperty("hibernate.connection.password", "admin")
            .setProperty("hibernate.show_sql", "true")
            .setProperty("hibernate.format_sql", "true")

            .setProperty("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory")
            .setProperty("hibernate.current_session_context_class", "org.hibernate.context.ThreadLocalSessionContext")
            .setProperty("current_session_context_class", "thread")

            .setProperty("hibernate.c3p0.min_size", "5")
            .setProperty("hibernate.c3p0.max_size", "20")
            .setProperty("hibernate.c3p0.timeout", "300")
            .setProperty("hibernate.c3p0.max_statements", "50")
            .setProperty("hibernate.c3p0.idle_test_period", "150")
            .setProperty("c3p0.maxIdleTime", "1800")
            .setProperty("hibernate.c3p0.acquire_increment", "5")
            .addResource("Persistencia/Cliente.hbm.xml")
            .addResource("Persistencia/Usuario.hbm.xml").buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
Grato por qualquer dica.
romarcio

Vc só precisa do: c3p0-0.9.1.2.jar

.setProperty("hibernate.current_session_context_class", "org.hibernate.context.ThreadLocalSessionContext")
.setProperty("hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory")
.setProperty("current_session_context_class", "thread") 

// use apenas estas
.setProperty("hibernate.current_session_context_class", "thread")
.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider")

Não entendi a questão do usuario e senha. Vc precisa criar um usuario e senha para logar na aplicação ou vc que mudar o usuario e senha do banco de dados que é configurado no hibernate?

hlghelcio

Novamente grato Romarcio.

Pretendo mudar o usuario e a senha da configuração do hibernate.

romarcio

hlghelcio:
Novamente grato Romarcio.

Pretendo mudar o usuario e a senha da configuração do hibernate.

Humm, dai não sei como fazer isso. Se pensar em algo eu posto aqui.

Criado 9 de outubro de 2010
Ultima resposta 12 de out. de 2010
Respostas 5
Participantes 2