Проблема "Нет подходящего драйвера" с 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: // локальный / тест имеет точно такое же поведение.

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");
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
8 650
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

в отличие от

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

Да, сначала у меня была более длинная версия (такое же поведение, работает с Java 6 / JDBC4 и не с Java 5 / JDBC3), я видел более короткую форму, которая где-то полагается на значения по умолчанию, и оставила ее там. Думаю, я верну отредактированный ответ для этого вопроса.

auramo 07.11.2008 22:48

Вы говорите «работать с 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?

У меня есть, и это не работает. В вашем случае драйвер JDBC4 для DB2, вероятно, был скомпилирован с версией 1.5 или более ранней. В случае PostgreSQL он скомпилирован с версией 1.6, поэтому 1.5 не может загружать классы.

auramo 07.11.2008 23:40
Ответ принят как подходящий

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

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

Спасибо! Это сработало. Каким-то образом я скопировал пример, в котором свойство класса драйвера отсутствовало. И поскольку он работал с установкой JDBC4 / Java6, я не мог понять, что могла быть проблема с файлом конфигурации.

auramo 10.11.2008 00:03

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

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

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/

Другие вопросы по теме