Проблема диалекта гибернации с конфигурацией Spring

Я использую Hibernate (через JPA), настроенный Spring, и когда я запускаю свое приложение (война развернута на Tomcat 6), я получаю эту ошибку:

org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set 

Это кажется странным, потому что я установил диалект гибернации следующим образом:

p:databasePlatform="org.hibernate.dialect.MySQL5Dialect

Для получения дополнительной информации здесь мой полный applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">


    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          p:driverClassName="com.mysql.jdbc.Driver"
          p:url="jdbc:mysql://localhost/room_management" p:username="root" p:password=""/>

    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
          p:dataSource-ref="dataSource" p:persistenceUnitName="RoomManagement">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
                  p:database="MYSQL"
                  p:databasePlatform="org.hibernate.dialect.MySQL5Dialect"
                  p:showSql="true"/>
        </property>
    </bean>

    <bean id="transactionManager"
          class="org.springframework.orm.jpa.JpaTransactionManager"
          p:entityManagerFactory-ref="entityManagerFactory"/>

    <context:annotation-config/>


    <context:component-scan base-package="com.parisdescartes.roommanagement.*"/>

    <tx:annotation-driven/>

</beans>

Итак, я решил уточнить диалект Hibernate в файле META-INF/persistence.xml, и на этот раз это работает. Вот как я это уточнял:

<properties>
            <property name="hibernate.dialect"
                      value="org.hibernate.dialect.MySQL5Dialect"/>
</properties>

У вас есть идея, почему Hibernate Dialect не устанавливается с помощью конфигурации Spring?


person Mik378    schedule 03.05.2012    source источник
comment
Как вы строите свою фабрику сеансов?   -  person Bitmap    schedule 04.05.2012
comment
Я просто использую аннотацию @PersistenceContext в ссылке entityManager   -  person Mik378    schedule 04.05.2012


Ответы (3)


Не уверен, почему это не будет работать с вашей конфигурацией. Возможно, что-то пойдет не так с использованием аннотации p:. Я опубликую свой код (который работает для моей конфигурации), чтобы попробовать, исправит ли он ваш код! :)

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false"/>
            <property name="generateDdl" value="true"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
        </bean>
    </property>
</bean>

Удачи!

person Byron Voorbach    schedule 04.05.2012

Немного поздно, но я думаю, что это может добавить ценности. Не обязательно добавлять свойство databasePlatform, если указать свойство database, адаптер сам определит диалект.

<property name="database" value="MYSQL" />

Соответствующий код от org.springframework.orm.jpa.vendor.HibernateJPAVendorAdapter

protected Class determineDatabaseDialectClass(Database database) {
    switch (database) {
        case DB2: return DB2Dialect.class;
        case DERBY: return DerbyDialect.class;
        case H2: return H2Dialect.class;
        case HSQL: return HSQLDialect.class;
        case INFORMIX: return InformixDialect.class;
        case MYSQL: return MySQLDialect.class;
        case ORACLE: return Oracle9iDialect.class;
        case POSTGRESQL: return PostgreSQLDialect.class;
        case SQL_SERVER: return SQLServerDialect.class;
        case SYBASE: return SybaseDialect.class;
        default: return null;
    }
}
person Abhijit Mazumder    schedule 17.12.2013
comment
вы дали мне идею, как перейти на пользовательский MysqlDialect. Просто расширьте HibernateJPAVendorAdapter и переопределите determineDatabaseDialectClass. в MSQL вернуть некоторый пользовательский класс dialect. Надеюсь, это может работать таким образом - person oak; 30.08.2015
comment
am .. только что проверил мой последний комментарий. он работает. но кажется, что custom class, переданный из другого переопределения determineDatabaseDialectClass, ничего не делает. на самом деле конструктор никогда не вызывается... - person oak; 30.08.2015

Диалект может определяться автоматически из DataSource драйвера. Так что ни hibernate.dialect ни database не понадобились. Если произошло исключение 'hibernate.dialect' not set, это обычно означает, что что-то не так с подключением к БД:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      p:dataSource-ref="dataSource"
      p:packagesToScan="ru.javawebinar.**.model">

    <property name="jpaPropertyMap">
        <map>
            <entry key="#{T(org.hibernate.cfg.AvailableSettings).FORMAT_SQL}" value="${hibernate.format_sql}"/>
            <entry key="#{T(org.hibernate.cfg.AvailableSettings).USE_SQL_COMMENTS}" value="${hibernate.use_sql_comments}"/>
        </map>
    </property>

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
              p:showSql="${jpa.showSql}">
        </bean>
    </property>
</bean>
person Grigory Kislin    schedule 02.10.2016