为什么org.hibernate.dialect.PostgreSQLDialect不能转换为org.hibernate.dialect.Dialect?

时间:2013-10-25 23:45:02

标签: hibernate postgresql

在hibernate.xml中,我有:

<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>

这就是我要做的事情:

final Session sess = sessionFactory.openSession();
Transaction tx = null;
try {
    tx = sess.beginTransaction();
    Collection<Rfc> rfcs;
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Rfc.class);
    criteria = criteria.add(Restrictions.like(Rfc.RFC_IDENTIFIER, input.replace('*', '%')));
    rfcs = criteria.list();
    // ...
    tx.commit();
} catch (final Exception e) {
    if (tx != null) {
        tx.rollback();
    }
    throw new IllegalArgumentException(e);
} finally {
    sess.close();
}

这一切似乎都很简单,但我得到了:

  

引起:java.lang.ClassCastException:org.hibernate.dialect.PostgreSQLDialect无法强制转换为org.hibernate.dialect.Dialect           在org.hibernate.service.jdbc.dialect.internal。

以下是我的pom.xml的相关内容:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <!--            <version>4.1.9.Final</version>-->
        <version>4.1.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.6.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.5.6-Final</version>
    </dependency>

我已将问题追溯到org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.constructDialect()的方法,我们在其中找到:

private Dialect constructDialect(String dialectName) {
    try {
        return ( Dialect ) classLoaderService.classForName( dialectName ).newInstance();
    }
    catch ( ClassLoadingException e ) {
        throw new HibernateException( "Dialect class not found: " + dialectName, e );
    }
    catch ( HibernateException e ) {
        throw e;
    }
    catch ( Exception e ) {
        throw new HibernateException( "Could not instantiate dialect class", e );
    }
}

尝试在此处实例化对话框会导致上述ClassCastException。

为了更加确定我有正确的类,我在其层次结构中显示了所有超类......这就是我在控制台中看到的内容:

class org.hibernate.dialect.PostgreSQLDialect

class org.hibernate.dialect.PostgreSQL82Dialect

class org.hibernate.dialect.PostgreSQL81Dialect

class org.hibernate.dialect.Dialect

但是......果然,     org.hibernate.dialect.Dialect.class.isAssignableFrom(classLoaderService.classForName(dialectName)) 返回false。

这可能是hibernate版本与Postgresql提供的驱动程序之间的某种不兼容性吗?

一直在撕扯我的头发。任何帮助非常感谢!

2 个答案:

答案 0 :(得分:4)

是的。看来,问题在于我试图混合各种hibernate依赖项的不兼容版本。我刚刚将上面引用的pom.xml部分替换为:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search</artifactId>
        <version>4.3.0.Final</version>
    </dependency>

我接下来的问题了!

答案 1 :(得分:1)

这是一个已经在 4.1.4.Final中修复的Hibernate已知错误

Hibernate错误报告:https://hibernate.atlassian.net/browse/HHH-7084