Кто-нибудь знает, что здесь происходит:
Я запускаю 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");
}




вы заметили, что URL-адрес подключения неполный
<property name = "connection.url">jdbc:postgresql:test</property>
в отличие от
<property name = "connection.url">jdbc:postgresql://localhost/test</property>
Вы говорите «работать с 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 не может загружать классы.
Я не вижу, чтобы вы указывали класс драйвера в конфигурации Hibernate. Попробуйте добавить следующее:
<hibernate-configuration>
<session-factory>
.
.
<property name = "connection.driver_class">org.postgresql.Driver</property>
.
</session-factory>
</hibernate-configuration>
Спасибо! Это сработало. Каким-то образом я скопировал пример, в котором свойство класса драйвера отсутствовало. И поскольку он работал с установкой JDBC4 / Java6, я не мог понять, что могла быть проблема с файлом конфигурации.
Одна из новых функций 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://codingexplorer.wordpress.com/2009/09/06/%E2%80%9Cno-suitable-driver%E2%80%9D-for-postgresql/
Да, сначала у меня была более длинная версия (такое же поведение, работает с Java 6 / JDBC4 и не с Java 5 / JDBC3), я видел более короткую форму, которая где-то полагается на значения по умолчанию, и оставила ее там. Думаю, я верну отредактированный ответ для этого вопроса.