2012-04-11 143 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)); 

しかし、オラクルに、私はこの例外を取得:docsから

!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

パブリッククラスAmbiguousTableNameExceptionextends DataSetException

この例外は、同じ名前の を持つ複数のテーブルにアクセスできる場合にIDataSetによってスローされます。これは通常、データベース 接続が同じテーブル の名前を含む複数のスキーマにアクセスできる場合に発生します。

解決策1) が1つのデータベーススキーマにのみアクセスできるデータベース接続資格情報を使用します。 2) DatabaseConnectionコンストラクタまたはDatabaseDataSourceConnectionコンストラクタのスキーマ名を指定します。 3) 修飾テーブル名のサポートを有効にします(ハウツードキュメントを参照)。

+0

ありがとう、私はすでにこの問題を解決しましたが、あなたが言及した解決策1でした。 –

+0

私は[spring-dbunit](https://github.com/excilys/spring-dbunit)を使用していますが、ソリューション1)はシステムプロパティ[spring.dbunit.schema](https:// github .com/excilys/spring-dbunit/issues/18)。 –

4

誰がSpringDBUnitを使用しますか。私はこの非常に厄介な問題に苦労しました。私はcom.github.springtestdbunit.bean.DatabaseConfigBeancom.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBeanの設定を追加して問題を解決しました。

これは、Oracle DB aginst Dbunitsを実行しながら、私は同じAmbiguousTableNameExceptionを持っていた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

のための私の完全な春のコンテキストです。それは正常に動作していたと1日間違いを投げ始めた。

Rootcause:ストアドプロシージャを呼び出すときに、誤って小文字に変更されました。大文字に変更すると、作業が気に入った。

私はiDatabaseTester.setSchemaようIDatabaseTester(「SCHEMANAMEINCAPS」)

にシェマ名を設定することでも、これを解決できる。また、あなたの接続は、同じテーブル名を持つ多くのスキーマにアクセスしないことを確認してください。私のためにそれを固定データベーススキーマを設定

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、そうでなければ、次のような問題になってしまいます、テーブル名が大文字でもあることを確認してください。

  • HibernateはDBUnitのは、下にDBからテーブル名を読み込み
  • 小文字でテーブルを作成しますケース
  • DBUnitは、大文字のテーブル名を使用してデータセットをインポートしようとします。
  • あいまいな名前の例外があります。

前回の実行(大文字と小文字の両方)で複数のテーブルが作成されたかどうかを確認することも忘れないでください。この場合も、テーブルをクリーンアップする必要があります。

関連する問題