2012-06-26 13 views
17

avendo più problemi con l'impostazione di ibernazione con spring3. questa volta si sta dicendo che la connessione è nulla in quanto non è impostato il dialetto che è sul mio file hibernate.cfg.xml.La connessione non può essere nullo quando "hibernate.dialect" non è impostato su

qui è l'eccezione 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 

Ecco il mio dataSource-config.xml i thats ets su per 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> 

E sotto è il file 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> 

Come potete vedere, il dialetto viene impostato.

edit: i miei database.properties il file

# 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 

edit: qui è una traccia stack completo. l'accesso al database potrebbe essere il problema, ma posso accedervi con successo tramite prompt dei comandi?

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

Non penso u possibile eseguire il debug di un file XML. Ho provato a eseguire il debug del codice java effettivo ma non lo raggiunge mai poiché sta ancora cercando di organizzare i bean e il relativo contesto di applicazione. – jonney

+0

Spring e Hibernate sono scritti anche in "codice java effettivo". Lo stacktrace rivela quali classi e metodi sono coinvolti nella creazione di SessionFactory. Basta impostare qualche punto di interruzione per scoprire dove le cose stanno andando male? – meriton

+0

Spiacente, ma non posso eseguire il debug delle librerie a meno che tu non importi l'intero progetto della classe lib nel tuo progetto. cose come "org.springframework.beans.factory" non possono essere debugate attraverso le librerie. – jonney

risposta

5

Manca la connessione al database. Aggiungi alla tua hibernate.cfg.xml un file di linee come questo

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

(sostituire localhost se il database non è installato sul computer, e impostare i valori che iniziano con your_ nel mio esempio).

+0

Ok cool. ho avuto quelle proprietà definite in un file .properties. è sbagliato? Inoltre, le connessioni del database sono definite su uno dei miei bean chiamato datasource – jonney

+0

Hibernate utilizza proprietà diverse da quelle che hai (Hibernate usa 'connection.url', stai usando' database.url'). Il tuo archivio di proprietà è forse per jdbc o per la primavera (non sto bene con la primavera) ?. Penso che mescolare questi due tipi di file di configurazione sia il problema, perché poi Hibernate ne vede solo la metà. – Johanna

+0

è per la primavera. Ho seguito una guida per spring + hibernate che ha la stessa identica cosa di setup e leggo anche spring in action book che usa un bean data source che si aggancia al bean sessionFactory. questo è quello che sto cercando di fare.per separare l'origine dati e la configurazione di ibernazione in modo da poter creare obiettivi di compilazione personalizzati che compilano e scaricano automaticamente le impostazioni appropriate di database/hbernate basate sull'ambiente che creerò apon – jonney

1

Credo che la vostra datasource-config.xml non è nel classpath

invece di avere questo file nella WEB-INF/datasource-config.xml

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

+0

aggiunto nuove informazioni di traccia dello stack La password – jonney

+0

specificata nel file di proprietà era errata. Penso che il problema precedente sia stato risolto. –

+0

ho ricontrollato la password ed è corretta. ovviamente non ho inserito la password reale in questo frammento di codice, ma la password che uso per accedere tramite cmd funziona per utente root e ho impostato la stessa password nelle proprietà e nel file hibernate.cfg – jonney

1

mi si sta utilizzando hibernate e InnoDB perché non si imposta la hibernate.dialect a org.hibernate.dialect.MySQL5 o org.hibernate.dialect.MySQL.

e la proprietà di connessione a hibernate.connection.url.

+0

im non usando InnoDB. usando solo mysql5 standard. Anche hibernate.connection.url è già impostato: jdbc: mysql: // localhost: 3306/freedom – jonney

+0

ma la proprietà è connection.url. – ssedano

+0

ahh capisco cosa intendi. l'ho appena cambiato e non ho risolto il problema stesso problema con il dialetto non viene impostato – jonney

2

Ho avuto lo stesso problema. Il passaggio da Apache Commons DataSource:

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

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

reso il mio problema andare via. Forse qualcuno può spiegare il perché, sono felice che funzioni e voglio condividere quel poco che so :)

1

penso che tu non sia configurato hibernate.cfg.xml.

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

È did't pubblicare il tuo codice di inizializzazione della sessione di fabbrica. Ma immagino che questo sia lo stesso problema con this one

Da Hibernate 4.3.2.Inizio, viene introdotto StandardServiceRegistryBuilder. Si prega di seguire questo ordine per inizializzare, ad es.:

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

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

Controllare bene il codice.

0

Penso che non si crea la configurazione come di seguito.

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

Migliore

0

Creazione di ServiceRegistry istanza separatamente e passarlo al buildSessionFactory può causare questo errore. Tenta di creare SessionFactory esempio come segue:

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

Penso proprio il problema di non caricare il file hibernate.cfg.xml nell'applicazione.

Anch'io ho avuto lo stesso problema. Ho provato con il seguente codice nel mio progetto:

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

Quindi ha funzionato bene. Spero che questo aiuti.

0

penso che l'errore con carter scaricando file di hibernate.cfg.xml dopo aver creato l'oggetto di configurazione in questo modo:

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

ho avuto l'lo stesso problema e la questione è stata, che il mio computer non è stato inserito nel pg_hba.conf del database postgres che consente a quali client (indirizzo IP) sono autorizzati a parlare con il database.

btw: Altri utenti dice che l'errore solleva anche se semplicemente dimentica di servizio a partire banca dati a livello locale

Problemi correlati