使用Spring和jdbc DataSourceTransactionManager填充H2数据库 [英] Populating H2 database with Spring and jdbc DataSourceTransactionManager

查看:211
本文介绍了使用Spring和jdbc DataSourceTransactionManager填充H2数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将H2嵌入式数据库与脚本配置一起使用,以在测试期间创建和加载数据库.

I am trying to use H2 embedded database with script config to create and load database during test.

它工作正常,但是当我尝试为数据库交互添加事务支持时,在上下文初始化期间出现错误.

It works fine but when I tried to add transaction support for my database interactions I am getting error during context initialization.

这是我的弹簧配置:

<bean id="dbcpDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:embeddedH2Database;MODE=Oracle;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<jdbc:embedded-database id="embeddedH2Database" type="H2">
    <jdbc:script location="classpath:db/sql/c`enter code here`reate-db.sql" />
    <jdbc:script location="classpath:db/sql/insert-data.sql" />
</jdbc:embedded-database>


<tx:advice id="txAdvice" transaction-manager="txManager">
    <!-- the transactional semantics... -->
    <tx:attributes>
        <tx:method name="*" timeout="60" />
    </tx:attributes>
</tx:advice>

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dbcpDataSource"/>
</bean>

<aop:config>
    <aop:pointcut id="serviceOperation" expression="execution(* x.y.service.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>

这是bean创建错误:

Here is bean creation error:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedH2Database': Cannot create inner bean '(inner bean)#23bff419' of type [org.springframework.jdbc.datasource.init.CompositeDatabasePopulator] while setting bean property 'databasePopulator'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#23bff419': Cannot create inner bean '(inner bean)#1d2bd371' of type [org.springframework.jdbc.datasource.init.ResourceDatabasePopulator] while setting bean property 'populators' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#1d2bd371': Cannot create inner bean '(inner bean)#65fe9e33' of type [org.springframework.jdbc.config.SortedResourcesFactoryBean] while setting bean property 'scripts'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#65fe9e33': Post-processing of FactoryBean's object failed; nested exception is java.lang.AssertionError

推荐答案

自从我使用事务以来,它就与脚本执行冲突以创建表和加载数据.

Since I was using transactions it was clashing with execution of scripts to create tables and load data.

这些脚本需要在不执行spring config添加的事务语义的情况下在外部执行.

These scripts need to be executed outside without applying transaction semantics added by spring config.

因此,我如下更改嵌入式数据库Bean以删除脚本元素:

So I changed embedded database bean as follows to remove script elements:

<jdbc:embedded-database id="embeddedH2Database" type="H2"/>

在测试之前添加@Sql注释以创建表和加载表.

And added @Sql annotation before my test to create table and load table.

@Sql({"classpath:db/sql/create-db.sql", "classpath:db/sql/insert-data.sql"})

这篇关于使用Spring和jdbc DataSourceTransactionManager填充H2数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆