Нет проблем с подходящим драйвером для Hibernate3, PostgreSQL 8.3 и Java 5

Кто-нибудь знает, что здесь происходит:

Я запускаю hibernate 3.2.6 для базы данных PostgreSQL 8.3 (установленной через fink) на моем Mac OS X. Настройка работает нормально, когда я использую Java 6 и драйвер JDBC 4 (postgresql-8.3-603.jdbc4). Однако мне это нужно для работы с Java 5 и (следовательно) JDBC 3 (postgresql-8.3-603.jdbc3). Когда я меняю банку в пути к классам и переключаюсь на Java 5 (я делаю это в eclipse), я получаю следующую ошибку:

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)

В чем проблема? Я этого не вижу. Вот моя конфигурация гибернации:

<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>

РЕДАКТИРОВАТЬ: Более длинная и обычная форма URL-адреса подключения: jdbc: postgresql: // localhost / test имеет точно такое же поведение.

Jar-файл драйвера определенно находится в пути к классам, и мне также не удается получить никаких ошибок с помощью этого прямого тестового кода JDBC:

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

person auramo    schedule 07.11.2008    source источник


Ответы (5)


Я не вижу, чтобы вы указывали класс драйвера в конфигурации Hibernate. Попробуйте добавить следующее:

<hibernate-configuration>
    <session-factory>
        .
        .
        <property name="connection.driver_class">org.postgresql.Driver</property>
        .
    </session-factory>
</hibernate-configuration>
person Brian Matthews    schedule 07.11.2008
comment
Спасибо! Это сработало. Каким-то образом я скопировал пример, в котором свойство класса драйвера отсутствовало. И поскольку он работал с установкой JDBC4 / Java6, я не мог понять, что могла быть проблема с файлом конфигурации. - person auramo; 10.11.2008

вы заметили, что URL-адрес подключения неполный?

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

в отличие от

<property name="connection.url">jdbc:postgresql://localhost/test</property>
person shyam    schedule 07.11.2008
comment
Да, сначала у меня была более длинная версия (такое же поведение, работает с Java 6 / JDBC4 и не с Java 5 / JDBC3), я видел более короткую форму, которая где-то полагается на значения по умолчанию, и оставила ее там. Думаю, я верну правку для этого вопроса. - person auramo; 07.11.2008

Вы говорите: «Работайте с Java 5 и (следовательно) с JDBC 3 (postgresql-8.3-603.jdbc3)». Возможно, это ошибочное предположение.

Меня смущает страница загрузки. Кажется, это подразумевает, что для Java 1.5 вам нужен JDBC3, но это не на 100% ясно. Я не уверен, почему драйвер JDBC4 не будет работать с Java 1.5 (мы используем драйвер JDBC4 DB2 с Java 1.5).

Вы пробовали драйвер JDBC4 с Java 1.5?

person Michael Sharek    schedule 07.11.2008
comment
У меня есть, и это не работает. В вашем случае драйвер JDBC4 для DB2, вероятно, был скомпилирован с версией 1.5 или ранее. В случае PostgreSQL он скомпилирован с версией 1.6, поэтому 1.5 не может загружать классы. - person auramo; 07.11.2008

Одна из новых функций JDBC4 - автоматическая загрузка через механизм поставщика услуг. Включив файл META-INF / services / java.sql.Driver в файл jar, больше нет необходимости выполнять Class.forName (""). Это работает только с 1.6 JVM.

person Kris Jurka    schedule 27.12.2009

У меня была та же проблема «не найден подходящий драйвер» с использованием сервлета, решение для регистрации драйвера:

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

Нашел решение здесь:

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/

person Solution    schedule 15.11.2010