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

Използвам Hibernate (чрез JPA), конфигуриран от Spring, и когато стартирам приложението си (война, разгърната на Tomcat 6), получавам тази грешка:

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

Изглежда странно, защото съм задал диалекта за хибернация, както следва:

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

За повече информация, тук моето пълно приложениеContext.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 Dialect във файла 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
съм.. просто тествах последния си коментар. то работи. но изглежда, че custom class, предадено на от друга замяна determineDatabaseDialectClass не прави нищо. всъщност конструкторът никога не се извиква... - person oak; 30.08.2015

Диалектът може да бъде автоматично открит от DataSource драйвер. Така че не бяха необходими нито hibernate.dialect, нито database. Ако се случи изключение 'hibernate.dialect' not set, това обикновено означава, че нещо не е наред с връзката с DB:

<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