Hibernate 3: impossible d'interroger la base de données PostgreSQL
-
01-07-2019 - |
Question
Je prépare un projet avec Hibernate 3.3.1 GA
et PostgreSQL 8.3
. Je viens de créer une base de données, la première table, y ai ajouté une ligne et maintenant je configure Hibernate.
Cependant, même la requête la plus simple:
Criteria criteria = session.createCriteria(Place.class);
List result = criteria.list();
n'a pas pu être exécuté (une liste vide est renvoyée bien qu'il y ait un enregistrement dans la base de données). J'ai consulté les journaux PostgreSQL pour voir:
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
J'ai écrit un programme simple utilisant JDBC pour récupérer les mêmes données et cela a fonctionné. Dans ce cas, les journaux PostgreSQL ressemblent à ceci (à titre de comparaison):
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
Le journal de débogage d’Hibernate n’indique aucune erreur. Si je prends la requête listée dans les journaux:
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=?
et l'exécutez contre la base de données dans le psql, cela fonctionne (cela signifie que Hibernate a généré un code SQL correct).
Ci-dessous, la configuration d'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>
... et le fichier de mappage:
<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>
googler pour une entrée de journal inattendue EOF
n'était pas friut. Des idées, une communauté?
La solution
Après avoir appliqué le débogueur au code d'Hibernate, il est corrigé!
Cela n'est pas visible dans le texte de la question, mais le problème est que Place
transmis à la méthode createCriteria ()
provient d'un autre package, et non com / example / data ??code>, spécifié dans les fichiers XML de configuration.
Hibernate appelle Class.isAssignableFrom ()
, et si false est renvoyé, il se ferme en mode silencieux, interrompant ainsi la connexion. Je vais ouvrir un ticket pour les développeurs Hibernate à ce sujet.