2012-04-11 13 views
6

मैं डाटाबेस बैकअप बनाने के लिए डबुनिट का उपयोग कर रहा हूं, जिसे आयात और निर्यात किया जा सकता है। मेरा एप्लिकेशन कई डेटाबेस इंजनों का उपयोग कर सकता है: MySQL, PostgreSQL, SQLServer, H2 और 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) 

उत्तर

10

docs से::

सार्वजनिक वर्ग 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)); 

लेकिन ओरेकल पर मैं इस अपवाद डेटासेट एक्सेप्शन

यह अपवाद IDataSet द्वारा फेंक दिया गया है जब वाले कई तालिकाओं के समान नाम उपलब्ध हैं। यह आमतौर पर तब होता है जब डेटाबेस कनेक्शन में समान तालिका नाम वाले एकाधिक स्कीमा तक पहुंच होती है।

संभावित समाधान: 1) एक डेटाबेस कनेक्शन क्रेडेंशियल केवल एक ही डेटाबेस स्कीमा के लिए पहुँच का उपयोग करें। 2) डाटाबेस कनेक्शन या डेटाबेसडेटासोर्सकनेक्शन कन्स्ट्रक्टर को स्कीमा नाम निर्दिष्ट करें। 3) योग्य तालिका नाम समर्थन सक्षम करें (देखें कैसे दस्तावेज़)।

+0

धन्यवाद, मैंने पहले ही इस मुद्दे को हल किया है, लेकिन यह आपके द्वारा उल्लिखित समाधान 1 द्वारा किया गया था। –

+0

मैं आप [spring-dbunit] का उपयोग कर रहे हैं (https://github.com/excilys/spring-dbunit), समाधान 1) सिस्टम प्रॉपर्टी [spring.dbunit.schema] सेट करके हासिल किया जा सकता है (https: // github .com/excilys/वसंत-dbunit/मुद्दों/18)। –

4

किसके लिए SpringDBUnit उपयोग करता है। मैं इस बहुत परेशान मुद्दे से जूझ रहा था। मैंने com.github.springtestdbunit.bean.DatabaseConfigBean और com.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean के लिए कॉन्फ़िगरेशन जोड़कर इस मुद्दे को हल कर लिया था।

यह मैं एक ही AmbiguousTableNameException था ओरेकल DB aginst Dbunits निष्पादित करते समय 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

के लिए अपना पूरा वसंत संदर्भ है। यह ठीक काम कर रहा था और एक दिन त्रुटि फेंकना शुरू कर दिया।

रूटकॉज़: संग्रहीत प्रक्रिया को कॉल करते समय, इसे गलती से कम मामले में संशोधित किया गया। जब ऊपरी मामले में बदल जाता है तो यह काम करता है।

मैं iDatabaseTester.setSchema ("SCHEMANAMEINCAPS") की तरह IDatabaseTester को शेमा नाम की स्थापना करके भी इस का समाधान कर सकता

यह भी सुनिश्चित करें अपने कनेक्शन केवल कई एक ही तालिका नाम होने स्कीमा के लिए पहुँच नहीं है कि सुनिश्चित करें।

1

स्थापना डेटाबेस स्कीमा मेरे लिए यह तय:

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

आप जब हाइबरनेट से डेटा आयात करने से पहले DBUnit चलाता मुद्दों का सामना कर सकते। आपके द्वारा उपयोग किए जा रहे डेटाबेस के अनुसार, तालिका और कॉलम नामों का आवरण महत्वपूर्ण हो सकता है।

उदाहरण के लिए, एचएसक्यूएल में, डेटाबेस नाम अपरकेस में घोषित किए जाने चाहिए। यदि आप हाइबरनेट के आयात के माध्यम से डेटा आयात करते हैं।

  • हाइबरनेट लोअर केस में टेबल बनाता
  • DBUnit कम में डीबी से तालिका नाम पढ़ता है: एसक्यूएल, अन्यथा आप निम्नलिखित समस्या के साथ खत्म हो जाएगा यकीन है कि तालिका नाम अपरकेस वहाँ में भी कर रहे हैं, केस
  • डीबीयूनीट ऊपरी केस टेबल नाम
  • का उपयोग करके अपने डेटासेट आयात करने का प्रयास करता है, आप संदिग्ध नाम अपवाद के साथ गड़बड़ में समाप्त होते हैं।

यह भी जांचना याद रखें कि पिछली दौड़ (ऊपरी और निचले मामले दोनों) के दौरान कई टेबल बनाए गए थे, इस मामले में आपको इसे साफ़ करने की आवश्यकता है।

संबंधित मुद्दे