PDA

Visualizza la versione completa : [JAVA] Hibernate, configurazione base


Gil Mour
04-10-2005, 23:15
Ho dei problemi con la configurazione di un semplice esempio "Getting started with.." con hibernate.
Questo perch l'esempio in questione (http://www.hibernate.org/hib_docs/v3/reference/en/html/quickstart.html ) vuole utilizzare il pooling di connessioni di Tomcat, mentre io per il momento non sono interessato e voglio utilizzare quello di default di hibernate.

Il flusso del programma di esempio il seguente:
Servlet->Session session = HibernateHelper.currentSession().

HibernateHelper da una eccezione in questo punto:


public class HibernateHelper {

private static final SessionFactory sessionFactory;

static
{
try
{
// **************** L'eccezione parte da qui
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Exception ex) {
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}

// ...
}


Infine, questo il file di configurazione che utilizzo. Probabilmente l'errore proprio qui, dato che ho tentato di togliere la gestione del pooling dbcp sostituendola con quella di default.. e del resto l'unica parte del tutto in cui ho messo le mani.



<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<!-- per JNDI
<property name="connection.datasource">java:comp/env/jdbc/hibernate</property>
-->

<property name="connection.url">jdbc:mysql://127.0.0.1/hibe</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.pool_size">5</property>

<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>




<mapping resource="Cat.hbm.xml"/>

</session-factory>

</hibernate-configuration>

Gil Mour
09-10-2005, 14:37
up
nessuno usa hibernate? oO

eumene
10-10-2005, 00:34
Sinceramente non mi trovo con l'uso che fai del file di configurazione.

Prima di tutto non sfrutti l'hibernate.properties?

Io uso questo mapping:



<hibernate-configuration>
<session-factory>
<property name="connection.datasource">java:comp/env/jdbc/hibe</property>
<property name="connection.datasource.removeAbandoned">true</property>
<property name="connection.datasource.removeAbandonedTimeout">60</property>
<property name="show_sql">true</property>
<property name="transaction.factory_class">net.sf.hibernate.transaction.JDBCTransactionFactor y</property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
<property name="connection.autoReconnect">true</property>
<property name="connection.autoReconnectForPools">true</property>
<property name="connection.is-connection-validation-required">true</property>


<mapping resource="Cat.hbm.xml"/>
</session-factory>
</hibernate-configuration>





hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql://localhost:3306/hibe
hibernate.connection.username root
hibernate.connection.password


Prova cos.

Gil Mour
10-10-2005, 00:44
Mi sfugge una cosa
Io ho capito che si puo usare o la config tramite xml o tramite properties. Cosi ho deciso di usare la conf xml, senza datasource/jndi/pooling dbcp ottenendo piu o meno la stessa cosa del properties che proponi nel tuo post, solo ficcato dentro un xml.

Devo comunque configurare entrambi, prop e xml oppure che errore ho fatto nel mio xml?

eumene
10-10-2005, 10:41
Perch non posti lo stackTrace, in modo da capire meglio l'errore.

Anche per ch, a parte le differenze di configurazione tra xml e properties, non vedo sostanziali errori nel codice.

Gil Mour
10-10-2005, 16:13
Io posso pure postarlo ma il 90% dello stack riguarda tomcat e catalina, l'unica eccezione rilevata quella sollevata dal codice che ho postato.

Tiro su un momento il server e posto lo stack.

Gil Mour
10-10-2005, 16:18
stack



java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.hibernate.cfg.Configuration.(Configuration.jav a:110)
at prova.HibernateHelper.(HibernateHelper.java:14)
at prova.Prova.doGet(Prova.java:15)


codice completo della servlet


public void doGet (HttpServletRequest request, HttpServletResponse response)
{
System.out.println("ciao");

Session session = HibernateHelper.currentSession();
Transaction tx = session.beginTransaction();

Cat c = new Cat();
c.setNome("Birba");

session.save(c);
tx.commit();

HibernateHelper.closeSession();

}


codice completo di hibernate helper


package prova;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateHelper {

private static final SessionFactory sessionFactory;

static
{
try
{
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Exception ex) {
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}

public static final ThreadLocal session = new ThreadLocal();

public static Session currentSession()
{
Session s = (Session) session.get();

if (s == null)
{
s = sessionFactory.openSession();
session.set(s);
}
return s;
}

public static void closeSession()
{
Session s = (Session) session.get();
if (s != null)
s.close();
session.set(null);
}



}

eumene
10-10-2005, 19:02
Attenzione! La NoClassDefFoundError un'eccezione generata quando manca una classe nel tuo classpath.

In particolare non hai aggiunto al tuo progetto le librerie Common di Apache, che sono (con le versioni che sto utilizzando):

[list=1]
commons-logging-1.0.4.jar
commons-dbcp-1.2.1.jar
commons-pool-1.2.jar
commons-collections-2.1.1.jar
[/list=1]

Verifica se tra le librerie di Hibernate che hai scaricato ci siano(dovrebbero esserci) e fai in modo di compilare i tuoi sorgenti aggiungendo le librerie al classpath

Gil Mour
10-10-2005, 21:28
Intanto ti ringrazio dei suggerimenti.

Nel post precedente ho dimenticato di specificare che le commons-logging ce le ho in web-inf/lib, e che contengono le classi richieste che lui dice di non trovare

Per quanto riguarda gli altri jar (che non ho nel classpath)...dbcp, per l'appunto, non lo voglio usare..le altre due a cosa servono?

eumene
15-10-2005, 09:55
Scusami, ma sono stato un po' lontano dal PC in questi giorni, anche se sembra impossibile prima di tutto a me.

Non so molto di queste libreririe, a dire il vero, so solo che senza il sistema non funziona e le richiede.

Non le utilizzo direttamente, bes Hibernate ne fa un uso trasparente. Posso solo limitarmi a farmi un'idea del loro impiego partendo dai nomi dei jar (pool e collection).

Non so dirti di pi, almeno per adesso. Magari faccio un po' di ricerche visto che ci lavoro tutti i giorni.

Eumene

Loading