在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提供的驱动程序之间的某种不兼容性吗?
一直在撕扯我的头发。任何帮助非常感谢!
答案 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