简体   繁体   English

如何设置Spring的DriverManagerDataSource的某些属性?

[英]How to set certain properties of Spring's DriverManagerDataSource?

I'm working a series of tutorial apps to go over different Java EE technologies. 我正在研究一系列教程应用程序,以介绍不同的Java EE技术。 I'm following various tutorials and more or less stick to them. 我正在关注各种教程,或多或少地坚持使用它们。 Recently, I started putting together a simple Spring CRUD webapp to store, find, modify, and delete employees in an Employee DB table. 最近,我开始组装一个简单的Spring CRUD Web应用程序,以在Employee DB表中存储,查找,修改和删除员工。 I have previously completed another, very similar app, which only used plain Java and Hibernate, and which aimed to achieve the exact same functionality. 我之前已经完成了另一个非常相似的应用程序,该应用程序仅使用普通的Java和Hibernate,并且旨在实现完全相同的功能。 That app worked alright, so I decided to copy over the database connection settings from this old app to the new, Spring one. 该应用程序运行良好,因此我决定将数据库连接设置从该旧应用程序复制到新的Spring 1。

Problem is, the Spring DriverManagerDataSource bean does not seem to accept setting of the same properties as the original Hibernate configuration did, for example "hibernate.hbm2ddl.auto", which I want for conveniently wiping out the DB at startup, or "defaultSchema", which Postgres requires for some reason, so I'm stuck at configuring the DB connection. 问题是,Spring DriverManagerDataSource bean似乎不接受与原始Hibernate配置相同的属性设置,例如“ hibernate.hbm2ddl.auto”(我希望在启动时方便地清除数据库)或“ defaultSchema” ,由于某种原因,Postgres需要使用它,因此我只能配置数据库连接。

How do I get Spring to accept these properties the same as Hibernate in the old app did, and to exhibit the same behavior? 如何让Spring接受与旧应用程序中的Hibernate相同的这些属性,并表现出相同的行为? Why isn't the bean accepting these particular properties in some predictable, sensible way, like there is for other properties such as "url" or "password"? 为什么bean不像某些其他属性(如“ url”或“ password”)那样以某种可预测的,明智的方式接受这些特殊属性? Am I even supposed to be setting them, isn't there some other mechanism in Spring that takes care of the functionality that I want from the properties? 我什至应该设置它们,Spring中是否没有其他机制可以满足我想要的属性功能?

Old app config: 旧应用配置:

hibernate.cfg.xml 的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>

Part of the Spring config taken from the tutorial which I attempt to modify as described above: Spring配置的一部分来自本教程,我试图如上所述进行修改:

spring-servlet.xml 为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>

Complete error message that my app in its current shape throws. 我的应用以当前形状抛出的完整错误消息。 I presume that it indicates that I'm attempting to set a property in a way that is not intended, so a syntax error of sorts. 我认为这表明我试图以一种不想要的方式设置属性,因此出现了某种语法错误。

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?

Hibernates properties are not part of data-source definition. 休眠属性不是数据源定义的一部分。 It should defined under session-factory bean. 它应该在会话工厂bean下定义。

for example: 例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM