2012-06-26 10 views
17

tiene más problemas para recomponer la hibernación con spring3. esta vez dice que la conexión es nula ya que el dialecto no está configurado, lo cual está en mi archivo hibernate.cfg.xml.La conexión no puede ser nula cuando 'hibernate.dialect' no está configurado

aquí es la excepción completo:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in URL [file:war/WEB-INF/datasource-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:44) 
    at org.springframework.test.context.TestContext.buildApplicationContext(TestContext.java:198) 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:233) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:126) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139) 
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.hibernate.HibernateException: Connection cannot be null when 'hibernate.dialect' not set 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:97) 
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:67) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:172) 
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71) 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2270) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2266) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1735) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1775) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:184) 
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:314) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452) 
    ... 29 more 

Aquí está mi thats dataSource-config.xml ets hasta la SessionFactory

<?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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     "> 


    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="${database.driver}" /> 
     <property name="url" value="${database.url}" /> 
     <property name="username" value="${database.user}" /> 
     <property name="password" value="${database.password} " /> 
    </bean> 

    <bean id="mySessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="packagesToScan" value="com.jr.freedom"/> 
     <property name="hibernateProperties" value="classpath:hibernate.cfg.xml"/> 

    </bean> 

    <!-- Declare a transaction manager --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
     p:sessionFactory-ref="mySessionFactory" /> 

</beans> 

Y a continuación es el archivo hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <!-- JDBC connection settings --> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/freedom</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.connection.password">password</property> 

     <!-- JDBC connection pool, use Hibernate internal connection pool --> 
     <property name="connection.pool_size">25</property> 

     <!-- Defines the SQL dialect used in Hiberante's application --> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 

     <!-- Enable Hibernate's automatic session context management --> 
     <property name="current_session_context_class">thread</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

     <!-- Display and format all executed SQL to stdout --> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 

     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">create</property> 

     <!-- Mapping to hibernate mapping files --> 
     <!--mapping resource="org/kodejava/example/hibernate/app/Label.hbm.xml"/--> 
    </session-factory> 
</hibernate-configuration> 

Como puede ver, el dialecto se está configurando.

edición: mis database.properties archivo

# DB properties file 

database.url=jdbc:mysql://localhost:3306/freedom 
database.driver=com.mysql.jdbc.Driver 
database.user=root 
database.password=password 
database.maxConnections=25 

edición: aquí hay una traza completa. acceder a la base de datos podría ser el problema, pero puedo acceder a él con éxito a través del símbolo del sistema?

2288 [main] WARN org.hibernate.engine.jdbc.internal.JdbcServicesImpl - HHH000342: Could not obtain connection to query metadata : Cannot create PoolableConnectionFactory (Access denied for user 'root'@'localhost' (using password: YES)) 
2289 [main] INFO org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.s[email protected]4f549ceb: defining beans [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0,org.springframework.format.support.FormattingConversionServiceFactoryBean#0,org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0,org.springframework.web.servlet.handler.MappedInterceptor#0,org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0,org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver#0,org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#0,org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,org.springframework.web.servlet.config.viewControllerHandlerMapping,userService,myDataSource,mySessionFactory,transactionManager,propertyConfigurer,org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0,viewResolver,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter#0,hello,userController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy 
2289 [main] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy method 'close' on bean with name 'myDataSource' 
2289 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Retrieved dependent beans for bean '(inner bean)#14': [org.springframework.web.servlet.config.viewControllerHandlerMapping] 
2289 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Retrieved dependent beans for bean '(inner bean)#8': [org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver#0] 
2289 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Retrieved dependent beans for bean '(inner bean)#1': [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#0] 
2290 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Retrieved dependent beans for bean '(inner bean)': [org.springframework.web.servlet.handler.MappedInterceptor#0] 
+0

No creo que u puede depurar un archivo XML. He intentado depurar el código de Java actual pero nunca lo alcanza, ya que todavía está tratando de organizar los beans y su contexto de aplicación – jonney

+0

Spring e Hibernate están escritos en "código real de Java" también. El stacktrace revela qué clases y métodos están involucrados en la construcción de SessionFactory. Simplemente establece un punto de quiebre allí para descubrir dónde van las cosas mal? – meriton

+0

Lo sentimos, pero no puedes depurar libs a menos que importes todo el proyecto de la clase lib en tu proyecto. cosas como "org.springframework.beans.factory" no se pueden depurar a través de libs. – jonney

Respuesta

5

Falta la conexión de la base de datos. Añadir a su hibernate.cfg.xml presentar una línea como esta

<property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="connection.url"> 
    jdbc:mysql://localhost:3306/your_database 
</property> 
<property name="connection.username">your_user</property> 
<property name="connection.password">your_password</property> 

(reemplace localhost si la base de datos no está instalado en su ordenador, y establecer los valores que comienzan con your_ en mi ejemplo).

+0

Ok, genial. Tenía esas propiedades definidas en un archivo .properties. es eso incorrecto? Además, las conexiones de la base de datos están definidas en uno de mis beans llamado datasource – jonney

+0

Hibernate utiliza propiedades diferentes a las que usted usa (Hibernate usa 'connection.url', está usando' database.url'). ¿Es su archivo de propiedades quizás para jdbc o para la primavera (no soy bueno con la primavera) ?. Creo que mezclar estos dos tipos de archivos de configuración es el problema, porque entonces Hibernate ve solo la mitad de ellos. – Johanna

+0

es para la primavera. Seguí una guía para spring + hibernate que tiene exactamente la misma configuración y también leo spring in action book que usa un bean dataSource que se engancha en el bean sessionFactory. eso es lo que trato de hacer.separar la fuente de datos y la configuración de hibernación para que pueda crear objetivos de compilación personalizados que construyan y descarguen automáticamente las configuraciones apropiadas de base de datos/hbernate basadas en el entorno construiré apon – jonney

1

Creo que su datasource-config.xml no está en la ruta de clase

en lugar de tener este archivo en WEB-INF/datasource-config.xml

copiarlo en WEB-INF/classes/datasource-config.xml

+0

agregó nueva información de seguimiento de pila – jonney

+0

contraseña que ha especificado en el archivo de propiedad era incorrecta. Creo que el problema anterior fue resuelto. –

+0

comprobé dos veces la contraseña y es correcta. obviamente, no publiqué una contraseña real en este fragmento de código, pero la contraseña que uso para iniciar sesión a través de cmd funciona para el usuario raíz y configuré la misma contraseña en las propiedades y el archivo hibernate.cfg – jonney

1

que está usando Hibernate y InnoDB ¿por qué no se establece la hibernate.dialect a org.hibernate.dialect.MySQL5 o org.hibernate.dialect.MySQL.

y la propiedad de conexión a hibernate.connection.url.

+0

no uso InnoDB. solo usando el estándar mysql5. También el hibernate.connection.url ya está configurado: jdbc: mysql: // localhost: 3306/freedom – jonney

+0

pero la propiedad es connection.url. – ssedano

+0

ahh entiendo lo que quieres decir. Lo cambié y no solucioné el problema. mismo problema con dialecto no establecido – jonney

2

Tuve el mismo problema. El cambio de la fuente de datos Apache Commons:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="${database.driver}" /> 
    <property name="url" value="${database.url}" /> 
    <property name="username" value="${database.user}" /> 
    <property name="password" value="${database.password} " /> 
</bean> 

Para C3P0:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUrl" value="jdbc:mysql://ipadress:3306/schema" /> 
    <property name="user" value="root" /> 
    <property name="password" value="abc" /> 
</bean> 

hizo que mi problema desaparezca. Tal vez alguien puede explicar por qué, estoy contento de que funcione y quiero compartir lo poco que sé :)

1

Creo que no está configurado hibernate.cfg.xml.

Configuration configuration = new Configuration(); 
configuration.configure("hibernate.cfg.xml"); 
SessionFactory factory = configuration.buildSessionFactory(); 
0

No ha publicado su código de inicialización de fábrica de la sesión. Pero supongo que este es el mismo problema con this one

De Hibernate 4.3.2.Final, se presenta StandardServiceRegistryBuilder. Siga este orden para iniciarse, p.:

Configuration configuration = new Configuration(); 
configuration.configure("com/jeecourse/config/hibernate.cfg.xml"); 

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
     configuration.getProperties()).build(); 
sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

Por favor, compruebe dos veces su código.

0

Creo que no crea la configuración como a continuación.

Configuration conf = new Configuration().configure(); 

Mejor

0

Creación de ServiceRegistry instancia por separado y pasarlo a buildSessionFactory puede causar este error. Trate de crear SessionFactory ejemplo, de la siguiente manera:

private static SessionFactory factory; 
factory = cfg.buildSessionFactory(
      new ServiceRegistryBuilder().applySettings(cfg.getProperties()) 
     .buildServiceRegistry()); 
1

Creo que es el problema de no cargar el archivo de hibernate.cfg.xml en su aplicación.

Yo también tengo el mismo problema. He intentado con el siguiente código en mi proyecto:

Configuration cfg = new Configuration(); 
cfg.configure("hibernate.cfg.xml"); 

Luego ha funcionado bien. Espero que esto ayude.

0

creo que el error entubado mediante la descarga de archivos hibernate.cfg.xml después de haber creado el objeto de configuración de la siguiente manera:

Configuration config = new Configuration(); 
config.configure("hibernate.cfg.xml"); 
0

tuve la el mismo problema y el problema era que mi equipo no era ingresado en el pg_hba.conf de la base de datos postgres que permite a los Clientes (Direcciones IP) hablar con la base de datos.

por cierto: Otros usuarios dice que el error plantea también si simplemente se olvidan de iniciar el servicio de base de datos a nivel local

Cuestiones relacionadas