PDA

View Full Version : Hibernate: Lo conoscete?


Akira83
29-07-2005, 17:05
Ciao a tutti, volevo sapere se c'è qualcuno che conosca bene Hibernate in modo da aiutarmi a farlo funzionare, visto che sono due giorni che tutti i miei tentativi falliscono inesorabilmente :muro: :muro:

Ho fatto mille prove ma mi blocco sempre difronte al seguente errore :

org.hibernate.exception.GenericJDBCException: Cannot open connection

Sto usando Tomcat 5.5 con MySQL 4.1. Ho seguito la guida punto punto ma niente arrivo sempre a questo punto e da qui non mi schiodo.
Ho già preparato il file hibernate.cfg.xml, il file oggetto.hbm.xml in cui definisco la corrispondenza tra la mia classe e la tabella del mio database e in più ho definito il file di contesto nel quale ho impostato tramite JNDI il datasource utilizzato dalla mia applicazione. Ripeto ho seguito la guida punto punto e ho praticamente ricopiato il tutto, ma l'errore sopra mi perseguita sempre.

Aiutatemi :cry: :cry:

ally
12-12-2006, 10:22
...sono incappato nello stesso problema...qualche consiglio?...

...ciao...

kazzinga
12-12-2006, 15:19
se postate il file hibernate.cfg.xml magari è possibile verificare che tutto sia impostato bene...BTW avete importato i driver JDBC per mySQL?

ally
12-12-2006, 15:32
...ho deciso di evolvere e così ho intrapreso la strada di hibernate + postgres...i file di configurazione penso siano corretti e posizionati nella giusta directory...sto seguendo il tutorial di hibernate...

...la action di test...



public class TestAction extends BaseAction {

private final String FORWARD_MAIN = "test";

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
long startMilliseconds = System.currentTimeMillis();
String returnForward = "wrongForward";
returnForward = "test";
ActionMessages messages = new ActionMessages();
try {
TestForm main = (TestForm)form;
Session session = HibernateUtil.currentSession();
System.out.println("Open? "+session.isOpen());
System.out.println("Connected? "+session.isConnected());
Transaction tx= session.beginTransaction();
session.beginTransaction();
Cat princess = new Cat();
princess.setName("Princess");
princess.setSex('F');
princess.setWeight(7.4f);
session.save(princess);
tx.commit();
HibernateUtil.closeSession();
}catch(Exception e) {
System.out.println(e);
throw e;
}
saveMessages(request, messages);
return (mapping.findForward(returnForward));
}
}



...il file di configurazione del "contenitore"...



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="it.assez">
<class name="it.assez.Cat" table="cat">
<id name="id" type="string">
<column name="c" not-null="true" sql-type="char(32)"/>
<generator class="uuid.hex"/>
</id>
<!-- A cat has to have a name, but it shouldn' be too long. -->
<property name="name">
<column length="16" name="name" not-null="true"/>
</property>
<property name="sex"/>
<property name="weight"/>
</class>
</hibernate-mapping>



...il file di configurazione di hibernate...



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

<hibernate-configuration>

<session-factory>

<property name="connection.datasource">java:comp/env/jdbc/PostHibernate</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>

<!-- Mapping files -->
<mapping resource="Cat.hbm.xml"/>

</session-factory>

</hibernate-configuration>



...ed infine il context nel server.xml...



<Context debug="0"
docBase="C:/Programmi/eclipse-SDK-3.0.1-win32/eclipse/workspace/PostHibernate/WebContent"
path="/PostHibernate" reloadable="true">
<Resource name="jdbc/PostHibernate" scope="Shareable" type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/PostHibernate">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<!-- DBCP database connection settings -->
<parameter>
<name>url</name>
<value>jdbc:postgresql://localhost/PostHibernates</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.postgresql.Driver</value>
</parameter>
<parameter>
<name>username</name>
<value>postgres</value>
</parameter>
<parameter>
<name>password</name>
<value>postgres</value>
</parameter>
<!-- DBCP connection pooling options -->
<parameter>
<name>maxWait</name>
<value>3000</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>100</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>10</value>
</parameter>
</ResourceParams>
</Context>



...l'errore viene scatenato alla riga "Transaction tx= session.beginTransaction();"...nella rete l'errore org.hibernate.exception.GenericJDBCException: Cannot open connection è legato principalmente a problemi di carico...situazione in cui il numero di connessioni supera il consentito...

...ciao...

ally
13-12-2006, 15:11
...problema risolto...ho inserito tutte le informazioni relative al context nel file di configurazione di hibernate eliminandole quindi dal context di tomcat...



<?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="connection.url">jdbc:postgresql://localhost/postgres</property>
<property name="connection.username">postgres</property>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="connection.password">postgres</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<!-- thread is the short name for
org.hibernate.context.ThreadLocalSessionContext
and let Hibernate bind the session automatically to the thread
-->
<property name="current_session_context_class">thread</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">false</property>

<!-- mapping files -->
<mapping resource="Cat.hbm.xml"/>

</session-factory>
</hibernate-configuration>



...ora mi sorge un dubbio...le classi pojo usate da hibernate possono venire estese?...volendo creare delle funzioni e delle variabili comuni per l'interfaccia con il db questa manovra sarebbe simpatica...la cosa che mi spaventa sono i file di mapping dei pojo...che non potendo essere estese dovranno mappare anche gli oggetti comuni...

...qualcuno ha esperienze in merito?...

...grazie...ciao...