2012-04-11 20 views
6

Ithalat ve dışa aktarılabilir veritabanı yedekleri oluşturmak için dbunit kullanıyorum. Uygulamam birçok veritabanı motoru kullanabilir: MySQL, PostgreSQL, SQLServer, H2 ve Oracle. Oracle + dbunit AmbiguousTableNameException alır

aşağıdaki kodla yukarıdaki iş cezası tümü

: docs itibaren

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

cevap

10

:

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

Fakat Oracle üzerinde

bu özel durum olsun DataSetException

Bu özel durum, aynı ada sahip birden çok tablo erişilebilir olduğunda IDataSet tarafından atılır. Bu genellikle, veritabanı bağlantısı, aynı tablo adlarını içeren birden çok şemaya erişim olduğunda oluşur.

Olası çözümler: 1) Yalnızca bir veritabanı şemasına erişimi olan bir veritabanı bağlantısı kimlik bilgisi kullanın. 2) DatabaseConnection veya DatabaseDataSourceConnection yapıcısına bir şema adı belirtin. 3) Kalifiye tablo adı desteğini etkinleştirin (bkz. Nasıl yapılır belgeleri).

+0

Teşekkürler, ben zaten bu sorunu çözdüm, ama bahsettiğiniz çözüm 1 tarafından yapıldı. –

+0

[spring-dbunit] (https://github.com/excilys/spring-dbunit) kullanıyorsunuz, çözüm 1) sistem özelliğini [spring.dbunit.schema] (https: // github) ayarlayarak elde edilebilir .com/excilys/yay DBUnit/sorunlar/18). –

4

Kim için SpringDBUnit kullanılır. Bu çok sinir bozucu sorunla uğraştım. com.github.springtestdbunit.bean.DatabaseConfigBean ve com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean için yapılandırma ekleyerek sorunu çözme işlemini bitirmiştim.

Bu Oracle DB aginst Dbunits yürütülürken aynı AmbiguousTableNameException vardı 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

için benim tam bahar bağlamdır. İyi çalışıyordu ve bir gün hata atmaya başladı.

Rootcause: saklı yordamı çağırırken, küçük harfe dönüştürmek yanlışlıkla değiştirildi. Büyük harfe dönüştürüldüğünde, çalışmayı seçti.

Ben

Ayrıca bağlantı aynı tablo adını sahip birçok şemalar erişmelerine izin vermez emin olun iDatabaseTester.setSchema ("SCHEMANAMEINCAPS") gibi IDatabaseTester için shema adını ayarlayarak da bu çözebilir.

1

veritabanı şeması benim için sabit Ayar: DBUnit dolmadan hazırda veri aktarırken

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

sorunlarla karşılaşabilirsiniz. Kullandığınız veritabanına göre, tablo ve sütun isimlerinin muhafazası önemli olabilir. Örneğin, HSQL'de veritabanı adları büyük harfle bildirilmelidir. Hazırda bekletme yoluyla verileri aldığınızda.

  • hazırda DBUnit alt içinde DB'den tablo adlarını okur
  • küçük harflerle tablolar oluşturur: sql, aksi sorunla ilgili şu ile bitireceğiz, tablo isimleri büyük harf orada da vardır emin olun
  • DBUnit, büyük harfli tablo adlarını kullanarak veri kümelerini içe aktarmayı dener
  • Belirsiz ad istisnasıyla bir karmaşa içinde sona erersiniz.

Ayrıca, önceki bir işlem sırasında (hem büyük hem de küçük harf) birden fazla tablonun oluşturulup oluşturulmadığını da kontrol etmeyi unutmayın; bu durumda, onu da temizlemeniz gerekir.