2012-05-03 13 views
5

uso de Hibernate (a través de la APP) configurado para la primavera y cuando inicio mi solicitud (guerra desplegados en Tomcat 6), me sale este error:tema dialecto de Hibernate con la configuración de la primavera

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

Parece extraño porque 've establecido el dialecto de hibernación de la siguiente manera:

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

Para obtener más información, aquí mi applicationContext.xml completo:

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

Por lo tanto, decidí precisar Hibernate Dialect dentro del archivo META-INF/persistence.xml, y esta vez eso funciona. Aquí cómo me precisó que:

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

¿Tiene una idea de por qué Hibernate dialecto no se establece mediante la configuración de primavera?

+0

¿Cómo se construye su fábrica de sesión? – Bitmap

+0

Simplemente uso la anotación @PersistenceContext en una referencia de entityManager – Mik378

Respuesta

23

No estoy seguro de por qué no funcionará con su configuración. Tal vez algo salga mal con el uso de la anotación p: ¡Publicaré mi código (que funciona para mi configuración) para probar si va a arreglar tu código! :)

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

¡Buena suerte!

+1

Esto solucionó el problema para mí. –

6

Un poco tarde, pero creo que esto podría agregar valor. No necesariamente necesita agregar la propiedad databasePlatform si especifica la propiedad database, el adaptador descubrirá el dialecto.

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

código pertinente de 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

me diste una idea de cómo cambiar a 'MysqlDialect' personalizado. Simplemente extienda 'HibernateJPAVendorAdapter' y anule' determineDatabaseDialectClass'. en 'MSQL' devuelve una clase' dialecto' personalizada. Espero que esto pueda funcionar de esa manera – oak

+0

am .. acaba de probar mi último comentario. corre. pero parece que la 'clase personalizada 'pasada de otra anulación' determineDatabaseDialectClass' no hace nada. de hecho, el 'constructor 'nunca se llama ... – oak

0

dialecto podría ser detectada automáticamente desde DataSource conductor. Por lo tanto, se necesitaron hibernate.dialect netos database. Si excepción 'hibernate.dialect' not set sucedió, por lo general significa, que algo anda mal con la conexión 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> 
Cuestiones relacionadas