2012-04-17 13 views
6

Recibo el siguiente error al intentar pasar los valores de un archivo de propiedades a Spring, para que no tenga que proporcionarlos directamente en hibernate.cfg.xml. ¿Hay un enfoque mejor (y correcto)? Sé que se está haciendo referencia al archivo de propiedades porque si introduzco una contraseña no válida, falla en eso. Estaría agradecido por cualquier ayuda.¿Cómo puedo pasar jdbc.properties a Spring/Hibernate?

WARNING: No connection properties specified - the user must supply JDBC connections 
Exception in thread "main" org.hibernate.HibernateException: Hibernate Dialect must be explicitly set 
    at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:57) 
    at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:39) 
    at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:426) 

Esta es applicationContext.xml:

<context:component-scan base-package="cmsutil"/> 
    <context:property-placeholder location="jdbc.properties"/> 

    <bean id="dataSource" 
      class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
      p:driverClassName="${jdbc.driverClassName}" 
      p:url="${jdbc.url}" 
      p:username="${jdbc.username}" 
      p:password="${jdbc.password}"/> 

    <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
      p:dataSource-ref="dataSource" 
      p:configurationClass="org.hibernate.cfg.AnnotationConfiguration" 
      p:packagesToScan="cmsutil.*"> 

     <property name="exposeTransactionAwareSessionFactory" value="false" /> 

     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
       <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> 
      </props> 
     </property> 

    </bean> 

    <bean id="txnManager" 
      class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
      p:sessionFactory-ref="sessionFactory"/> 

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>   

Este es mi archivo hibernate.cfg.xml:

<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <mapping resource="cmsutil.entity/contentcomponent.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

solicitud de Per Ramesh - web.xml

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>2</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.htm</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>redirect.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

Para Ramesh, esta es mi jdbc.propertie s, que se encuentra en el directorio raíz (/src/java/jdbc.properties)

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://xx:3306/x 
jdbc.username=y 
jdbc.password=z 


hibernate.dialect=org.hibernate.dialect.MySQLDialect 
hibernate.show_sql=true 
hibernate.format_sql=false 
hibernate.generate_statistics=false 

Respuesta

8

añadir este bean en su actualización applicationContext.xml

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="location"><value>classpath:jdbc.properties</value></property> 
    </bean> 

esto en web.xml en lugar de escucha

<servlet> 
    <servlet-name>context</servlet-name> 
    <servlet-class> 
     org.springframework.web.context.ContextLoaderServlet 
     </servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
+0

Gracias por la sugerencia. Intenté eso, pero obtuve el mismo error. Muy frustrante. Esto debe ser más simple de lo que lo estoy haciendo. – EdgeCase

+0

puede actualizar el web.xml aquí –

+0

Se agregó web.xml según su solicitud. Gracias. – EdgeCase

0

Tuve el mismo problema pero fue el resultado de un error en mi código de Java. Se requirió llamar al configure() en el Configuration antes de llamar al buildSessionFactory().

el Javadoc para configure() método:

las asignaciones de uso y propiedades especificado en un recurso de aplicación hibernate.cfg.xml llamado.

Código roto:

public static void main(String[] args) { 
     Configuration cfg = new Configuration(); 

     factory = cfg.buildSessionFactory(); // missing the configure() call 

     Session s = factory.openSession(); 
     Transaction tx = null; 
     try { 
      tx = s.beginTransaction(); 

Solución:

public static void main(String[] args) { 
     Configuration cfg = new Configuration(); 

     factory = cfg.configure().buildSessionFactory(); 

     Session s = factory.openSession(); 
     Transaction tx = null; 
     try { 
      tx = s.beginTransaction(); 

Nota: no estaba usando una configuración de primavera.

Cuestiones relacionadas