2009-10-06 2 views
2

Я использую следующий контекст весна приложения:Java Spring: AnnotationSessionFactoryBean, Hibernate-Диалект Autodetection

<!-- Hibernate session factory --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="hibernateProperties"> 
     <props> 
     <!-- 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      --> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop> 

      <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> 
      <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> 
      <prop key="hibernate.cache.provider_class">${hibernate.cache.provider}</prop> 

      <prop key="hibernate.connection.pool_size">10</prop> 
      <prop key="hibernate.jdbc.batch_size">1000</prop> 
      <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop> 

     </props> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
      ... 
     </list> 
    </property> 

    <property name="schemaUpdate" value="${hibernate.schemaUpdate}"/> 
</bean> 

Тогда проблема заключается в: Хотя Hibernate должен поддерживать диалекте-Autodetection этот код не работает: Uppon Application-инициализировать следующее исключение:

org.hibernate.HibernateException: The dialect was not set. Set the property hibernate.dialect. 
    at org.hibernate.dialect.Dialect.instantiateDialect(Dialect.java:256) 
    at org.hibernate.dialect.Dialect.getDialect(Dialect.java:234) 
    at org.hibernate.dialect.Dialect.getDialect(Dialect.java:249) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean$3.doInHibernate(LocalSessionFactoryBean.java:957) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419) 
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:339) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.updateDatabaseSchema(LocalSessionFactoryBean.java:953) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterSessionFactoryCreation(LocalSessionFactoryBean.java:843) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:213) 

я могу избежать этого исключения раскомментировав свойство hibernate.dialect. Почему я должен это делать? Почему can not hibernate просто autodetect диалект, как он должен?

Я хочу, чтобы удалить диалект-свойство, чтобы решить проблему this.

ответ

6

Hibernate сам пробует для автоматического обнаружения диалекта во время Configuration.buildSessioNFactory() звонок - и обычно, хотя и не всегда, преуспевает.

Весенний код, однако, не является - и именно там вы получаете исключение. Метод LocalSessionFactoryBean.updateDatabaseSchema() использует метод Dialect.getDialect() для получения Dialect экземпляра, который требует явно заданного диалекта.

Я не совсем уверен, почему это так, но я подозреваю, что это предосторожность против Hibernate ошибочно обнаруживает ваш диалект неправильно и испортил вашу базу данных в результате (так как схема обновления потенциально может быть довольно катастрофической).

варианта:

  1. Явного определение диалекту
  2. Установка schemaUpdate ложную
  3. Расширения LocalSessionFactoryBean и первостепенную updateDatabaseSchema() способа взять (уже определенные автоматически) диалект из экземпляра сеанса фабрики.

Вы должны класса бросайте его SessionFactoryImplementor для этого:

public void updateDatabaseSchema() throws DataAccessException { 
    final Dialect dialect = ((SessionFactoryImplementor) getSessionFactory()).getDialect(); 
    ... 
    hibernateTemplate.execute(new HibernateCallback() { 
    ... 
    // you already have the dialect so you don't need to get it using this: 
    // Dialect dialect = Dialect.getDialect(getConfiguration().getProperties()); 
    ... 
); 
}