2017-10-06 75 views
0

我正在开发一系列教程应用程序,以了解不同的Java EE技术。我遵循各种教程,并且或多或少地坚持它们。最近,我开始组建一个简单的Spring CRUD Web应用程序来存储,查找,修改和删除员工数据库表中的员工。我以前完成了另一个非常类似的应用程序,它只使用普通的Java和Hibernate,并且旨在实现完全相同的功能。该应用程序工作正常,所以我决定将这个旧应用程序的数据库连接设置复制到新的Spring应用程序中。如何设置Spring的DriverManagerDataSource的某些属性?

问题是,Spring的DriverManagerDataSource bean似乎没有接受与原始Hibernate配置相同的属性设置,例如“hibernate.hbm2ddl.auto”,我想在启动时方便地清除数据库,或者是由于某种原因Postgres需要的“defaultSchema”,所以我一直在配置数据库连接。

如何让Spring在老应用程序中接受与Hibernate相同的属性,并展现相同的行为?为什么不是以某种可预测的,合理的方式接受这些特定属性,比如“url”或“password”等其他属性?我甚至应该设置他们,是不是有一些其他机制在春天照顾我想从属性的功能?

旧应用程序配置:

的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <!-- Database connection settings --> 
     <property name="connection.driver_class">org.postgresql.Driver</property> 
     <property name="connection.url">jdbc:postgresql://localhost:5432/test2</property> 
     <property name="connection.username">postgres</property> 
     <property name="connection.password">postgres</property> 

     <property name="hibernate.default_schema">public</property> 
     <property name="show_sql">true</property> 
     <property name="use_sql_comments">true</property> 
     <property name="hibernate.hbm2ddl.auto">create</property> 

     <mapping class="cz.bsc.hibernatetest.hibernatetutorial.domain.Book" /> 
     <mapping class="cz.bsc.hibernatetest.hibernatetutorial.domain.Author" /> 

    </session-factory> 
</hibernate-configuration> 

部分从教程采取Spring配置我试图修改如上所述的:

弹簧-servlet.xml

<beans...> 
    <bean id="ds" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver"></property> 
     <property name="url" value="jdbc:postgresql://localhost:5432/test2"></property> 
     <property name="username" value="postgres"></property> 
     <property name="password" value="postgres"></property> 

     <property name="spring.jpa.hibernate.defaultSchema" value="public"></property> 
     <property name="spring.jpa.hibernate.show_sql" value="true"></property> 
     <property name="spring.jpa.hibernate.use_sql_comments" value="true"></property> 
     <property name="spring.jpa.hibernate.hbm2ddl.auto" value="create"></property> 
    </bean> 
</beans> 

完整的错误消息,我的应用程序在其当前形状引发。我认为这表明我试图以一种不打算的方式设置属性,因此出现了各种语法错误。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'empController': Unsatisfied dependency expressed through field 'dao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dao' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Cannot resolve reference to bean 'jt' while setting bean property 'template'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jt' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Cannot resolve reference to bean 'ds' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ds' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'spring.jpa.hibernate.defaultSchema' of bean class [org.springframework.jdbc.datasource.DriverManagerDataSource]: Nested property in path 'spring.jpa.hibernate.defaultSchema' does not exist; nested exception is org.springframework.beans.NotReadablePropertyException: Invalid property 'spring' of bean class [org.springframework.jdbc.datasource.DriverManagerDataSource]: Bean property 'spring' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 
+0

春天已经支持JPA,并从一开始休眠。你应该做更多的研究。如果您想更新,请查看Spring Boot和Spring Data。 – duffymo

+0

谢谢,我会看看这些内容,看看我能否找到某种东西来指向获得我想要的功能的方式。 – Sargon1

+0

https://spring.io/guides/gs/accessing-data-jpa/ – duffymo

回答

1

冬眠属性不是数据源定义的一部分。 它应该在会话工厂bean下定义。

例如:

<beans> 
    <bean id="ds" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver"></property> 
     <property name="url" value="jdbc:postgresql://localhost:5432/test2"></property> 
     <property name="username" value="postgres"></property> 
     <property name="password" value="postgres"></property> 
    </bean> 


    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 

     <property name="dataSource" ref bean="ds" /> 
       <property name="packagesToScan" value="db entities package name" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.defaultSchema">public</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.use_sql_comments">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
</beans> 
相关问题