2013-10-25 3 views
3

В hibernate.xml, у меня есть:Почему org.hibernate.dialect.PostgreSQLDialect не может быть передан в org.hibernate.dialect.Dialect?

<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 at 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.

Просто быть очень уверен, что я имею право класса, я показал весь суперкласс в своей иерархии ... и вот именно то, что я вижу в моей консоли:

класса org.hibernate.dialect.PostgreSQLDialect

класс org.hibernate.dialect.PostgreSQL82Dialect

класс org.hibernate.dialect.PostgreSQL81Dialect

класс org.hibernate.dialect.Dialect

еще ... конечно, org.hibernate.dialect.Dialect.class.isAssignableFrom (classLoaderService.classForName (dialectName)) возвращает ложь.

Это может быть какая-то несовместимость между версиями hibernate и драйверами, предоставляемыми Postgresql?

Отрывал мои волосы. Любая помощь очень ценится!

ответ

4

Да. Проблема, похоже, состояла в том, что я пытался смешивать несовместимые версии различных спящих зависимостей. Я только что заменил раздел pom.xml, цитируемый выше:

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

И я нахожусь в своем следующем выпуске!

+0

Пожалуйста, отметьте ваш вопрос решен. Благодаря! – ALOToverflow

Смежные вопросы