2012-04-11 2 views
6

dbunit을 사용하여 가져오고 내보낼 수있는 데이터베이스 백업을 만듭니다. 내 응용 프로그램은 MySQL, PostgreSQL, SQLServer, H2 및 Oracle과 같은 여러 데이터베이스 엔진을 사용할 수 있습니다. Oracle + dbunit에서 AmbiguousTableNameException을 얻습니다.

다음 코드를 사용하여 위의 잘 작동의 모든

은 다음 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

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

그러나 오라클에

나는이 예외가 DataSetException

같은 이름을 가진 여러 테이블에 액세스 할 수있는 경우이 예외는 IDataSet에 의해 발생합니다. 이는 데이터베이스 연결이 동일한 테이블 이름을 포함하는 여러 스키마에 대한 액세스 권한을 가지고있을 때 주로 발생합니다.

가능한 해결책 : 1) 하나의 데이터베이스 스키마에만 액세스 권한이있는 데이터베이스 연결 자격 증명을 사용하십시오. 2) DatabaseConnection 또는 DatabaseDataSourceConnection 생성자에 대한 스키마 이름을 지정하십시오. 3) 정규화 된 테이블 이름 지원을 사용 가능하게 설정합니다 (How-to 문서 참조).

+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에 대한 구성을 추가하여 문제를 해결했습니다.

이 오라클 DB 맞아야 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

내 전체 스프링 상황이다. 그것은 잘 작동하고 언젠가는 오류를 던지기 시작했다.

Rootcause : 저장 프로 시저를 호출하는 중 실수로 소문자로 수정되었습니다. 대문자로 변경되면 작업이 뭉쳤다.

나는

는 또한 연결이 동일한 테이블 이름을 가진 많은 스키마에만 액세스하지 않도록하십시오 iDatabaseTester.setSchema ("SCHEMANAMEINCAPS")처럼 IDatabaseTester에 쉐마 이름을 설정하여도이 문제를 해결 할 수있다.

1

데이터베이스 스키마가 나를 위해 그것을 고정 설정 : DBUnit를 실행하기 전에 최대 절전 모드에서 데이터를 가져올 때

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

당신은 문제가 발생할 수 있습니다. 사용중인 데이터베이스에 따르면 테이블 및 열 이름의 대소 문자가 중요 할 수 있습니다.

예를 들어, HSQL에서 데이터베이스 이름은 대문자로 선언해야합니다. 최대 절전 모드 가져 오기를 통해 데이터를 가져 오는 경우.

  • Hibernate는 DBUnit를 낮은에서 DB에서 테이블 이름을 읽어
  • 소문자로 테이블을 생성합니다 : SQL, 그렇지 않으면 당신은 다음과 같은 문제가 될 겁니다, 테이블 이름은 대문자 거기에 또한 확인 case
  • DBUnit이 대문자 테이블 이름을 사용하여 데이터 세트를 가져 오려고 시도합니다.
  • 모호한 이름 예외로 엉망이됩니다.

이전 실행 (대문자와 소문자) 중에 여러 개의 테이블이 만들어 졌는지 확인하십시오.이 경우에도 테이블을 정리해야합니다.