代码之家  ›  专栏  ›  技术社区  ›  Sergey Mikhanov

Hibernate 3:无法查询PostgreSQL数据库

  •  3
  • Sergey Mikhanov  · 技术社区  · 17 年前

    我正在使用 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  
    

    休眠调试日志不指示任何错误。如果我接受日志中列出的查询:

    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-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 日志条目不是friutful。有什么想法吗,社区?

    1 回复  |  直到 9 年前
        1
  •  2
  •   N00b Pr0grammer TChia    9 年前

    在将调试器应用于休眠代码之后,它被修复了!

    它在问题文本中不可见,但问题是 Place 传递给 createCriteria() 方法来自另一个包,而不是 com/example/data ,在配置XML文件中指定。

    休眠调用 Class.isAssignableFrom() ,如果返回了false,它将静默退出,从而断开连接。我会为Hibernate开发人员开一张关于这件事的罚单。

    推荐文章