Я создаю проект с использованием Hibernate 3.3.1 GA и PostgreSQL 8.3. Я только что создал базу данных, первую таблицу, добавил туда одну строку и теперь настраиваю Hibernate.
Однако даже самый простой запрос:
Criteria criteria = session.createCriteria(Place.class);
List result = criteria.list();
не может быть выполнено (возвращается пустой список, хотя в базе есть одна запись). Я просмотрел журналы PostgreSQL, чтобы увидеть:
2008-09-17 22:52:59 CEST LOG: connection received: host=192.168.175.1 port=2670
2008-09-17 22:52:59 CEST LOG: connection authorized: user=... database=...
2008-09-17 22:53:00 CEST LOG: execute <unnamed>: SHOW TRANSACTION ISOLATION LEVEL
2008-09-17 22:53:02 CEST LOG: could not receive data from client: Connection reset by peer
2008-09-17 22:53:02 CEST LOG: unexpected EOF on client connection
2008-09-17 22:53:02 CEST LOG: disconnection: session time: 0:00:03.011 user=... database=... host=192.168.175.1 port=2670
Я написал простую программу, используя простой JDBC для получения тех же данных, и она сработала. Журналы PostgreSQL в этом случае выглядят так (для сравнения):
2008-09-17 22:52:24 CEST LOG: connection received: host=192.168.175.1 port=2668
2008-09-17 22:52:24 CEST LOG: connection authorized: user=... database=...
2008-09-17 22:52:25 CEST LOG: execute <unnamed>: SELECT * from PLACE
2008-09-17 22:52:25 CEST LOG: disconnection: session time: 0:00:00.456 user=... database=... host=192.168.175.1 port=2668
Журнал отладки Hibernate не указывает на ошибки. Если я возьму запрос, указанный в журналах:
15:17:01,859 DEBUG org.hibernate.loader.entity.EntityLoader: Static select for entity com.example.data.Place: select place0_.ID as ID0_0_, place0_.NAME as NAME0_0_, place0_.LATITUDE as LATITUDE0_0_, place0_.LONGITUDE as LONGITUDE0_0_ from PLACE place0_ where place0_.ID=?
и выполнить его снова в базе данных в psql, он работает (это означает, что Hibernate сгенерировал правильный SQL).
Ниже представлена конфигурация Hibernate:
<hibernate-configuration>
<session-factory>
<property name = "hibernate.connection.url">jdbc:postgresql://192.168.175.128:5433/...</property>
<property name = "hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name = "hibernate.connection.username">...</property>
<property name = "hibernate.connection.password">...</property>
<property name = "dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name = "hibernate.show_sql">true</property>
<property name = "hibernate.use_outer_join">true</property>
<mapping resource = "com/example/data/Place.hbm.xml"/>
</session-factory>
</hibernate-configuration>
... и файл сопоставления:
<hibernate-mapping package = "com.example.data">
<class name = "com.example.data.Place" table = "PLACE">
<id column = "ID" name = "id" type = "java.lang.Integer">
<generator class = "native"/>
</id>
<property column = "NAME" name = "name" not-null = "true" type = "java.lang.String">
<meta attribute = "use-in-tostring">true</meta>
</property>
<property column = "LATITUDE" name = "latitude" not-null = "true" type = "java.lang.Float">
<meta attribute = "use-in-tostring">true</meta>
</property>
<property column = "LONGITUDE" name = "longitude" not-null = "true" type = "java.lang.Float">
<meta attribute = "use-in-tostring">true</meta>
</property>
</class>
</hibernate-mapping>
Поиск в Google записи в журнале unexpected EOF оказался неэффективным. Есть идеи, сообщество?




После применения отладчика к коду Hibernate это исправлено!
Это не видно в тексте вопроса, но проблема в том, что Place, переданный методу createCriteria(), принадлежит другому пакету, а не com/example/data, указанному в файлах конфигурации XML.
Hibernate вызывает Class.isAssignableFrom(), и если возвращается false, он тихо завершает работу, разрывая соединение. Я открою заявку для разработчиков Hibernate по этому поводу.
Похоже, проблема в вашей конфигурации. Можете ли вы опубликовать его без имени пользователя / пароля?