2012-05-03 16 views
5

używam hibernacji (przez WZP) skonfigurowany przez wiosnę i kiedy uruchomić mój wniosek (wojna wdrożony na Tomcat 6), otrzymuję ten błąd:Hibernate problem dialekt z konfiguracją Wiosna

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

Wydaje się dziwne, bo Wcześniej ustawić hibernacji dialekt następująco:

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

Aby uzyskać więcej informacji, tutaj moje pełne 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> 

Postanowiłem więc precyzyjnie zaznaczyć Dialekt Hibernacji w pliku META-INF/persistence.xml i tym razem to zadziała. Oto, jak to sprecyzowałem:

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

Masz pomysł, dlaczego Hibernacja Dialect nie jest ustawiona za pomocą konfiguracji Spring?

+0

Jak zbudować fabryki sesji? – Bitmap

+0

Używam tylko adnotacji @PersistenceContext na obiekcie entityManager reference – Mik378

Odpowiedz

23

Nie wiem, dlaczego nie będzie działać z konfiguracją. Może coś pójdzie nie tak z użyciem p: adnotacji. Opublikuję mój kod (który działa dla mojej konfiguracji), aby spróbować, jeśli to naprawi twój kod! :)

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

Powodzenia!

+1

Naprawiono problem dla mnie. –

6

Trochę za późno, ale myślę, że może to dodać wartości. Niekoniecznie musisz dodać właściwość databasePlatform, jeśli podasz właściwość database, sam adapter wykombinuje dialekt.

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

odpowiedni kod z 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; 
    } 
} 
+0

dałeś mi pomysł, jak zmienić niestandardowy "MysqlDialect". Po prostu rozszerz 'HibernateJPAVendorAdapter' i nadpisuj' determineDatabaseDialectClass'. w 'MSQL' zwraca pewną niestandardową klasę' dialect'. Mam nadzieję, że to zadziała w ten sposób – oak

+0

.. po prostu przetestowałem mój ostatni komentarz. to biegnie. ale wygląda na to, że 'klasa niestandardowa' przekazana do innej operacji override' determineDatabaseDialectClass' nic nie robi. w rzeczywistości "konstruktor" nigdy nie jest nazywany ... – oak

0

Dialekt mogą być wykrywane automatycznie z DataSource kierowcy. Tak więc potrzebne były dodatkowe hibernate.dialect no database. Jeśli wyjątek 'hibernate.dialect' not set stało, to zwykle znaczy, niż coś z połączenia 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> 
Powiązane problemy