2012-04-11 72 views
6

我正在使用dbunit創建可以導入和導出的數據庫備份。我的應用程序可以使用多種數據庫引擎:MySQL,PostgreSQL,SQLServer,H2和Oracle。Oracle + dbunit獲取AmbiguousTableNameException

上述所有做工精細用下面的代碼:

  // 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)); 

但在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) 

回答

10

docs

公共類AmbiguousTableNameExceptionextends DataSetException

當具有 相同名稱的多個表可以訪問時,IDataSet拋出此異常。這通常發生在數據庫 連接有權訪問包含相同表 名稱的多個模式時。

可能的解決方案:1)使用僅對一個數據庫模式具有 訪問權限的數據庫連接憑證。 2)將模式名稱指定給DatabaseConnection或DatabaseDataSourceConnection構造函數的 。 3) 啓用限定的表名稱支持(請參閱使用說明文檔)。

+0

謝謝,我已經解決了這個問題,但它是由您提到的解決方案1。 – 2012-04-16 08:15:10

+0

我正在使用[spring-dbunit](https://github.com/excilys/spring-dbunit),解決方案1)可以通過設置系統屬性[spring.dbunit.schema](https:// github的.com/excilys /彈簧的DbUnit /問題/ 18)。 – 2013-04-03 09:33:12

4

爲誰使用SpringDBUnit。我曾經爲這個非常惱人的問題而苦苦掙扎。我最終通過添加com.github.springtestdbunit.bean.DatabaseConfigBeancom.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean的配置來解決問題。

這是SpringDBUnit

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

我充滿春天的上下文而執行Dbunits aginst Oracle數據庫我有同樣的AmbiguousTableNameException。它工作正常,有一天開始拋出錯誤。

Rootcause:在調用存儲過程時,它被錯誤地修改爲小寫。當更改爲大寫時,它盯着工作。

我也解決了這個由像iDatabaseTester.setSchema(「SCHEMANAMEINCAPS」)的瑪名字爲IDatabaseTester

同時請確保您連接不只能訪問到具有相同表名稱很多模式。

1

設置數據庫模式固定爲我:

@Bean 
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection(final DataSource dataSource){ 
    final DatabaseDataSourceConnectionFactoryBean connectionFactory = new DatabaseDataSourceConnectionFactoryBean(); 
    connectionFactory.setDataSource(dataSource); 
    connectionFactory.setSchema(DB_SCHEMA); 
    return connectionFactory; 
} 
0

從休眠導入數據時DBUnit的運行之前,您可能會遇到的問題。根據您使用的數據庫,表名列的名稱可能很重要。

例如,在HSQL中,必須以大寫形式聲明數據庫名稱。 如果您通過Hibernate導入導入數據。SQL,確保表格名稱也以大寫出現,否則你會用下列問題結束:

  • 休眠創建表小寫
  • DBUnit的降低讀取數據庫表名case
  • DBUnit嘗試使用大寫字母表名稱導入其數據集
  • 您最終陷入一團糟,名稱模糊不清。

還記得檢查在上一次運行過程中是否創建了多個表(大寫和小寫),在這種情況下,您也需要清理它。