2012-04-11 27 views
6

Tôi đang sử dụng dbunit để tạo bản sao lưu cơ sở dữ liệu, có thể được nhập và xuất. Ứng dụng của tôi có thể sử dụng một số công cụ cơ sở dữ liệu: MySQL, PostgreSQL, SQLServer, H2 và Oracle.Oracle + dbunit được AmbiguousTableNameException

Tất cả các tốt công việc trên với đoạn mã sau:

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

Nhưng trên Oracle tôi nhận được ngoại lệ này:

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

Trả lời

10

Từ docs:

AmbiguousTableNameExceptionextends public class DataSetException

Trường hợp ngoại lệ này được IDataSet ném khi nhiều bảng có cùng tên là . Điều này thường xảy ra khi kết nối cơ sở dữ liệu có quyền truy cập vào nhiều lược đồ có chứa tên bảng giống nhau .

Các giải pháp có thể có: 1) Sử dụng thông tin xác thực kết nối cơ sở dữ liệu có quyền truy cập chỉ vào một lược đồ cơ sở dữ liệu. 2) Chỉ định tên lược đồ cho hàm xây dựng cơ sở dữ liệu hoặc Trình kết nối cơ sở dữ liệu DatabaseDataSourceConnection. 3) Bật hỗ trợ tên bảng đầy đủ (xem Tài liệu hướng dẫn).

+0

Cảm ơn, tôi đã giải quyết vấn đề này, nhưng đó là giải pháp mà bạn đã đề cập. –

+0

Tôi đang sử dụng [spring-dbunit] (https://github.com/excilys/spring-dbunit), giải pháp 1) có thể đạt được bằng cách thiết lập thuộc tính hệ thống [spring.dbunit.schema] (https: // github .com/excilys/spring-dbunit/issue/18). –

4

Đối với người sử dụng SpringDBUnit. Tôi đã phải vật lộn với vấn đề rất khó chịu này. Tôi đã kết thúc giải quyết vấn đề bằng cách thêm cấu hình cho com.github.springtestdbunit.bean.DatabaseConfigBeancom.github.springtestdbunit.bean.DatabaseDataSourceConnectionFactoryBean.

Đây là bối cảnh mùa xuân đầy đủ của tôi cho 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

tôi đã có AmbiguousTableNameException cùng trong khi thực hiện Dbunits aginst Oracle DB. Nó hoạt động tốt và bắt đầu ném lỗi vào một ngày nào đó.

Rootcause: trong khi gọi thủ tục được lưu trữ, nó bị sửa đổi do nhầm lẫn thành chữ thường. Khi thay đổi thành chữ hoa, nó hoạt động bình thường.

tôi có thể giải quyết điều này cũng bằng cách đặt tên shema để IDatabaseTester như iDatabaseTester.setSchema ("SCHEMANAMEINCAPS")

Ngoài ra hãy chắc chắn rằng kết nối của bạn không truy cập vào chỉ để nhiều schemas có tên cùng một bảng.

1

Thiết database schema cố định nó cho tôi:

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

Bạn có thể gặp vấn đề khi nhập dữ liệu từ Hibernate trước DBUnit chạy. Theo cơ sở dữ liệu bạn đang sử dụng, vỏ của tên bảng và cột có thể là quan trọng.

Ví dụ: trong HSQL, tên cơ sở dữ liệu phải được khai báo bằng chữ hoa. Trong trường hợp bạn nhập dữ liệu qua nhập Hibernate.sql, hãy chắc chắn tên bảng cũng ở chữ hoa ở đó, nếu không bạn sẽ kết thúc với các vấn đề sau đây:

  • Hibernate tạo ra các bảng trong trường hợp thấp hơn
  • DBUnit đọc tên bảng từ DB trong thấp trường hợp
  • DBUnit cố gắng nhập bộ dữ liệu của nó bằng cách sử dụng tên bảng chữ hoa
  • Bạn kết thúc bằng một mớ hỗn độn, với ngoại lệ tên không rõ ràng.

Hãy nhớ cũng kiểm tra xem có nhiều bảng được tạo trong lần chạy trước đó (cả chữ hoa và chữ thường), trong trường hợp này bạn cũng cần xóa nó.

Các vấn đề liên quan