2008-11-07 10 views
1

Quelqu'un sait-il ce qui se passe ici:"Aucun pilote approprié" problème avec Hibernate3, PostgreSQL 8.3 et Java 5

Je lance en veille prolongée 3.2.6 contre PostgreSQL 8.3 (installé via fink) base de données sur mon Mac OS X La configuration fonctionne correctement lorsque j'utilise Java 6 et le pilote JDBC 4 (postgresql-8.3-603.jdbc4). Cependant, j'ai besoin de ce truc pour travailler avec Java 5 et (par conséquent) JDBC 3 (postgresql-8.3-603.jdbc3). Quand je change le pot dans le classpath et passer à Java 5 (je le fais dans l'éclipse), je reçois l'erreur suivante:

Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) 
<Rows clipped for readability> 
Caused by: java.sql.SQLException: No suitable driver 
    at java.sql.DriverManager.getConnection(DriverManager.java:545) 
    at java.sql.DriverManager.getConnection(DriverManager.java:140) 
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:110) 
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423) 

Quel est le problème ici? Je ne peux pas voir. Voici ma configuration de mise en veille prolongée:

<hibernate-configuration> 

    <session-factory> 
     <property name="connection.url">jdbc:postgresql:test</property> 
     <property name="connection.username">postgres</property> 
     <property name="connection.password">p</property> 
     <property name="connection.pool_size">1</property> 
     <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> 
     <property name="current_session_context_class">thread</property> 
     <property name="show_sql">true</property> 
     <mapping resource="com/mydomain/MyClass.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

EDIT: Plus, plus forme habituelle de l'URL de connexion: jdbc: postgresql: // localhost/test a exactement le même comportement.

Le pot de pilote est sans aucun doute dans le chemin de classe, et je ne gère pas aussi d'obtenir des erreurs avec ce code de test JDBC direct:

public static void main(String[] args) throws Exception { 
    Class.forName("org.postgresql.Driver"); 
    Connection con=DriverManager.getConnection("jdbc:postgresql://localhost/test","postgres", "p"); 
} 

Répondre

4

Je ne vous vois pas en train de spécifier la classe de pilote dans votre configuration Hibernate. Essayez d'ajouter ce qui suit:

<hibernate-configuration> 
    <session-factory> 
     . 
     . 
     <property name="connection.driver_class">org.postgresql.Driver</property> 
     . 
    </session-factory> 
</hibernate-configuration> 
+0

Merci! Ça a marché. D'une certaine façon j'avais copié un exemple où la propriété de classe de conducteur n'était pas présente. Et parce que cela fonctionnait avec JDBC4/Java6-setup, je ne pouvais pas comprendre qu'il pouvait y avoir un problème avec le fichier de configuration. – auramo

1

avez-vous remarqué que l'URL de connexion est incomplète

<property name="connection.url">jdbc:postgresql:test</property> 

par opposition à

<property name="connection.url">jdbc:postgresql://localhost/test</property> 
+0

Oui, j'ai d'abord eu la version la plus longue en premier (même comportement, fonctionne avec Java 6/JDBC4 et pas avec Java 5/JDBC3), j'ai vu le sh forme d'orter qui s'appuie sur des défauts quelque part et l'a laissé là. Je quitte, je vais changer d'édition pour la question. – auramo

1

Vous dites « travailler avec Java 5 et (donc) JDBC 3 (postgresql-8.3 -603.jdbc3). " Peut-être que c'est une hypothèse erronée. Le download page est confus pour moi. Cela semble impliquer que pour Java 1.5, vous avez besoin de JDBC3 mais ce n'est pas clair à 100%. Je ne sais pas pourquoi le pilote JDBC4 ne fonctionnera pas avec Java 1.5 (nous utilisons un pilote DB2 JDBC4 avec Java 1.5).

Avez-vous essayé le pilote JDBC4 avec Java 1.5?

+0

J'ai, et cela ne fonctionne pas. Dans votre cas, le pilote JDBC4 pour DB2 a probablement été compilé avec 1.5 ou plus tôt. Dans le cas de PostgreSQL, il est compilé avec 1.6 et donc 1.5 ne peut pas charger les classes. – auramo

1

L'une des nouvelles fonctionnalités de JDBC4 est le chargement automatique via le mécanisme du fournisseur de services. En incluant un fichier META-INF/services/java.sql.Driver dans le fichier jar, il n'est plus nécessaire d'utiliser Class.forName (""). Cela ne fonctionne qu'avec la JVM 1.6.

1

J'ai eu le même problème "aucun pilote suiteble trouvé" à l'aide d'une servlet la solution pour enregistrer un pilote est:

Class driverClass = Class.forName("org.postgresql.Driver"); 
DriverManager.registerDriver((Driver) driverClass.newInstance()); 

trouvé la solution ici:

http://www.java2s.com/Tutorial/Java/0340__Database/DriverManagergetDriversenumeratealltheloadedJDBCdrivers.htm

http://codingexplorer.wordpress.com/2009/09/06/%E2%80%9Cno-suitable-driver%E2%80%9D-for-postgresql/

Questions connexes