2012-04-11 10 views
6

Estoy usando dbunit para crear copias de seguridad de la base de datos, que se pueden importar y exportar. Mi aplicación puede usar varios motores de bases de datos: MySQL, PostgreSQL, SQLServer, H2 y Oracle.Oracle + dbunit obtiene AmbiguousTableNameException

Todo lo anterior funcionan bien con el siguiente código:

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

Pero en Oracle que obtienen esta excepción:

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

Respuesta

10

Desde el docs:

AmbiguousTableNameExceptionextends clase pública DataSetException

IDataSet lanza esta excepción cuando se puede acceder a varias tablas que tienen el mismo nombre . Esto generalmente ocurre cuando la conexión de base de datos tiene acceso a múltiples esquemas que contienen nombres de tabla idénticos .

Posibles soluciones: 1) Use una credencial de conexión de base de datos que tenga acceso a un solo esquema de base de datos. 2) Especifique un nombre de esquema para el constructor DatabaseConnection o DatabaseDataSourceConnection. 3) Habilite el soporte de nombre de tabla calificado (consulte la documentación de Cómo hacerlo).

+0

Gracias, ya he resuelto este problema, pero fue por la solución 1 que mencionaste. –

+0

I está utilizando [spring-dbunit] (https://github.com/excilys/spring-dbunit), la solución 1) se puede lograr estableciendo la propiedad del sistema [spring.dbunit.schema] (https: // github .com/excilys/spring-dbunit/issues/18). –

4

Para quién usa SpringDBUnit. He luchado con este problema tan molesto. Terminé resolviendo el problema agregando la configuración para com.github.springtestdbunit.bean.DatabaseConfigBean y com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean.

Ésta es mi contexto primavera llena de 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

que tenía el mismo AmbiguousTableNameException durante la ejecución de Dbunits Aginst base de datos Oracle. Funcionó bien y comenzó a lanzar un error un día.

Rootcause: al llamar a un procedimiento almacenado, se modificó por error en minúsculas. Cuando cambió a mayúscula, miró funcionando.

que podía resolver esto también estableciendo el nombre Sema a IDatabaseTester como iDatabaseTester.setSchema ("SCHEMANAMEINCAPS")

También asegúrese de que su conexión no tiene acceso únicamente a muchos esquemas que tienen mismo nombre de tabla.

1

Ajuste del esquema de base fija para mí:

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

Puede encontrarse con problemas al importar datos de hibernación antes de DBUnit corre. De acuerdo con la base de datos que está utilizando, la carcasa de los nombres de tabla y columna podría ser importante.

Por ejemplo, en HSQL, los nombres de las bases de datos deben declararse en mayúsculas. En caso de importar datos a través de la importación de Hibernate.SQL, asegúrese de que los nombres de las tablas también están en mayúsculas existe, de lo contrario va a terminar con el siguiente problema:

  • Hibernate crea las tablas en minúsculas
  • DBUnit lee los nombres de las tablas de la base de datos en la parte baja case
  • DBUnit intenta importar sus conjuntos de datos utilizando nombres de tablas en mayúsculas
  • Usted termina en un lío, con la excepción de nombre ambiguo.

Recuerde comprobar también si varias tablas fueron creados durante una ejecución anterior (tanto en mayúsculas y minúsculas), en cuyo caso es necesario limpiar para arriba también.

Cuestiones relacionadas