Oracle + dbunit获取AmbiguousTableNameException

Jos*_*pez 9 java sql database oracle dbunit

我使用dbunit创建数据库备份,可以导入和导出.我的应用程序可以使用几个数据库引擎:MySQL,PostgreSQL,SQLServer,H2和Oracle.

所有上述工作都可以使用以下代码:

            // Connect to the database 
        conn =BackupManager.getInstance().getConnection();
        IDatabaseConnection connection = new DatabaseConnection(conn);
        InputSource xmlSource = new InputSource(new FileInputStream(new File(nameXML)));
        FlatXmlProducer flatXmlProducer = new FlatXmlProducer(xmlSource);
        flatXmlProducer.setColumnSensing(true);

        DatabaseOperation.CLEAN_INSERT.execute(connection,new FlatXmlDataSet(flatXmlProducer));  
Run Code Online (Sandbox Code Playgroud)

但在Oracle上我得到了这个例外:

!ENTRY es.giro.girlabel.backup 1 0 2012-04-11 11:51:40.542
!MESSAGE Start import backup
org.dbunit.database.AmbiguousTableNameException: AQ$_SCHEDULES
    at org.dbunit.dataset.OrderedTableNameMap.add(OrderedTableNameMap.java:198)
    at org.dbunit.database.DatabaseDataSet.initialize(DatabaseDataSet.java:231)
    at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:281)
    at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
    at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
    at es.giro.girlabel.backup.ImportBackup.createData(ImportBackup.java:39)
    at es.giro.girlabel.backup.handlers.Import.execute(Import.java:45)
Run Code Online (Sandbox Code Playgroud)

Ada*_*kes 14

来自文档:

public class AmbiguousTableNameException extends DataSetException

IDataSet当可以访问具有相同名称的多个表时,抛出此异常.当数据库连接可以访问包含相同表名的多个模式时,通常会发生这种情况.

可能的解决方案:

1)使用只能访问一个数据库模式的数据库连接凭据.

2)指定架构名称的 DatabaseConnectionDatabaseDataSourceConnection构造.

3)启用限定表名称支持(请参阅操作方法文档).


Esc*_*ran 5

为谁使用SpringDBUnit。我一直在为这个非常烦人的问题而苦苦挣扎。我已经结束了通过增加配置解决问题com.github.springtestdbunit.bean.DatabaseConfigBeancom.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean

这是我对SpringDBUnit的完整Spring上下文

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521/XE" />
        <property name="username" value="xxxx" />
        <property name="password" value="xxxx" />
    </bean>


    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>xxx.example.domain.Person</value>
            </list>
        </property>
    </bean>

    <bean id="dbUnitDatabaseConfig" class="com.github.springtestdbunit.bean.DatabaseConfigBean">
        <property name="skipOracleRecyclebinTables" value="true" />
        <property name="qualifiedTableNames" value="true" />
        <!-- <property name="caseSensitiveTableNames" value="true"/> -->
    </bean>
    <bean id="dbUnitDatabaseConnection"
        class="com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="databaseConfig" ref="dbUnitDatabaseConfig" />
        <property name="schema" value="<your_schema_name>"/>
    </bean>
Run Code Online (Sandbox Code Playgroud)