9

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

しかし、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)
4

5 に答える 5

16

ドキュメントから:

public class AmbiguousTableNameException extends DataSetException

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

可能な解決策:

1) 1 つのデータベース スキーマのみにアクセスできるデータベース接続資格情報を使用します。

DatabaseConnection2) orDatabaseDataSourceConnectionコンストラクタにスキーマ名を指定します 。

3) 修飾されたテーブル名のサポートを有効にします (ハウツー ドキュメントを参照)。

于 2012-04-11T14:36:09.407 に答える
5

SpringDBUnit を使用している方向け。私はこの非常に厄介な問題に苦労していました。と の構成を追加することで、問題を解決することにcom.github.springtestdbunit.bean.DatabaseConfigBeanなりcom.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>
于 2014-08-02T22:12:42.110 に答える
2

データベーススキーマを設定すると、それが修正されました:

@Bean
public DatabaseDataSourceConnectionFactoryBean dbUnitDatabaseConnection(final DataSource dataSource){
    final DatabaseDataSourceConnectionFactoryBean connectionFactory = new DatabaseDataSourceConnectionFactoryBean();
    connectionFactory.setDataSource(dataSource);
    connectionFactory.setSchema(DB_SCHEMA);
    return connectionFactory;
}
于 2016-09-20T10:36:53.507 に答える
0

DBUnit の実行前に Hibernate からデータをインポートすると、問題が発生する場合があります。使用しているデータベースによっては、テーブル名と列名の大文字と小文字が重要になる場合があります。

たとえば、HSQL では、データベース名は大文字で宣言する必要があります。Hibernate の import.sql 経由でデータをインポートする場合は、テーブル名も大文字であることを確認してください。そうしないと、次の問題が発生します。

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

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

于 2016-12-17T11:12:44.380 に答える
0

Oracle DBに対してDbunitsを実行しているときに、同じ AmbiguousTableNameException が発生しました。それは正常に機能していて、ある日エラーをスローし始めました。

根本原因: ストアド プロシージャの呼び出し中に、誤って小文字に変更されました。大文字に変更すると、動作し始めました。

iDatabaseTester.setSchema("SCHEMANAMEINCAPS") のように、スキーマ名を IDatabaseTester に設定することでも、これを解決できます。

また、接続が同じテーブル名を持つ多くのスキーマにのみアクセスしないようにしてください。

于 2015-04-27T10:08:30.133 に答える