Hibernate 3:无法查询 PostgreSQL 数据库
Posted
技术标签:
【中文标题】Hibernate 3:无法查询 PostgreSQL 数据库【英文标题】:Hibernate 3: unable to query PostgreSQL database 【发布时间】:2010-09-11 14:41:20 【问题描述】:我正在使用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:静态选择实体 com.example.data.Place:选择 place0_.ID 作为 ID0_0_,place0_.NAME 作为 NAME0_0_,place0_.LATITUDE 作为 LATITUDE0_0_,place0_.LONGITUDE作为 LONGITUDE0_0_ 从 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>
谷歌搜索unexpected EOF
日志条目并不有趣。有什么想法吗,社区?
【问题讨论】:
看起来问题可能出在您的配置中。没有用户名/密码可以发布吗? 【参考方案1】:在将调试器应用到 Hibernate 代码后,它是固定的!
它在问题的文本中不可见,但问题是传递给createCriteria()
方法的Place
来自另一个包,而不是com/example/data
,在配置XML 文件中指定。
Hibernate 调用Class.isAssignableFrom()
,如果返回 false,它会静默退出,从而中断连接。我会在这件事上为 Hibernate 开发者开一张票。
【讨论】:
以上是关于Hibernate 3:无法查询 PostgreSQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章
JPA Hibernate 调用 Postgres 函数 Void 返回 MappingException:
范围 COUNT 查询基于 Hibernate 中纪元时间戳的 DATE
Hibernate 3:无法查询 PostgreSQL 数据库