2012-04-17 18 views
6

Viene visualizzato il seguente errore durante il tentativo di inoltrare i valori da un file di proprietà a Spring, in modo da non doverli fornire direttamente in hibernate.cfg.xml. C'è un approccio migliore (e corretto)? So che il file delle proprietà viene referenziato perché se inserisco una password non valida, non riesce su quello. Sarei grato per qualsiasi aiuto.Come posso passare 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) 

Questo è 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"/>   

Questo è il mio file 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> 

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

Per Ramesh, questo è il mio jdbc.propertie s, che si trova nella directory principale (/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 

risposta

8

aggiungere questo fagiolo nel tuo aggiornamento applicationContext.xml

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

questo in web.xml invece di chi ascolta

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

Grazie per il suggerimento. Ho provato questo, ma ho ottenuto lo stesso errore. Molto frustrante. Questo deve essere più semplice di come lo faccio io. – EdgeCase

+0

puoi aggiornare il web.xml qui –

+0

Aggiunto web.xml come da tua richiesta. Grazie. – EdgeCase

0

Ho avuto lo stesso problema ma era il risultato di un errore nel mio codice java. È necessario chiamare configure() su Configuration prima di chiamare buildSessionFactory().

Il Javadoc per configure() metodo:

Utilizzare le mappature e le proprietà specificate in una risorsa applicazione nome hibernate.cfg.xml.

Codice rotto:

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(); 

Soluzione:

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: non stavo usando una configurazione di primavera.

Problemi correlati