2012-05-03 16 views
5

uso Hibernate (attraverso JPA) configurato entro la primavera e quando lancio la mia domanda (guerra distribuito su Tomcat 6), ottengo questo errore:Hibernate problema dialetto con configurazione di Spring

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

Sembra strano perché io 've impostare il dialetto Hibernate come segue:

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

Per ulteriori informazioni, ecco il mio pieno 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> 

Così, ho deciso di precisare Hibernate Dialect all'interno del file META-INF/persistence.xml, e questa volta funziona. Ecco come ho precisato che:

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

Avete un idea del perché Hibernate dialetto non viene impostata con configurazione di Spring?

+0

Come si fa a costruire la vostra fabbrica sessione? – Bitmap

+0

Uso semplicemente l'annotazione @PersistenceContext su un riferimento entityManager – Mik378

risposta

23

Non sono sicuro del motivo per cui non funzionerà con la configurazione. Forse qualcosa va storto usando la p: annotazione. Pubblicherò il mio codice (che funziona per la mia configurazione) per provare se risolverà il tuo codice! :)

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

Buona fortuna!

+1

Ciò ha risolto il problema per me. –

6

Un po 'in ritardo, ma penso che questo potrebbe aggiungere valore. Non necessariamente è necessario aggiungere la proprietà databasePlatform se si specifica la proprietà database, l'adattatore stesso determinerà il dialetto.

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

codice di cui 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

mi hai dato un'idea di come passare a custom 'MysqlDialect'. Estendi semplicemente 'HibernateJPAVendorAdapter' e sostituisci' verifyDatabaseDialectClass'. in 'MSQL' restituisce qualche classe' dialect' personalizzata. Spero che questo possa funzionare in questo modo – oak

+0

.. ho appena testato il mio ultimo commento. corre. ma sembra che la 'classe personalizzata' passata da altri override' defineDatabaseDialectClass' non faccia nulla. infatti il ​​'costruttore 'non viene mai chiamato ... – oak

0

Sottolinguaggio potrebbe essere rilevata automaticamente da DataSource conducente. Quindi nether hibernate.dialect n. database erano necessari. Se eccezione 'hibernate.dialect' not set successo, di solito significa, che qualcosa non va con connessione 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> 
Problemi correlati