2011-10-19 25 views
14

Tôi muốn đơn vị kiểm tra lớp MyBatis persistence của tôi bằng cách sử dụng cơ sở dữ liệu trong bộ nhớ HSQL. Ứng dụng thực sự sử dụng cơ sở dữ liệu Oracle. Điều này làm việc tốt đơn vị, chúng tôi bắt đầu thêm số tự động tăng lên cho các cột id. Oracle yêu cầu sử dụng một chuỗi để có được số lượng tăng dần, do đó một chuỗi được gọi là base_seq được tạo trong cơ sở dữ liệu Oracle. Trong MyBatis tập tin mapper XML của tôi, tôi có điều này:Đơn vị thử nghiệm MyBatis với HSQL thay vì Oracle

<insert id="insertBasis" parameterType="com.foo.Basis" useGeneratedKeys="true" keyProperty="id"> 
     <selectKey resultType="long" keyProperty="id" order="BEFORE"> 
      SELECT basis_seq.NEXTVAL FROM DUAL 
     </selectKey> 
     insert into basis 
     (id, name) 
     values 
     (#{id}, #{name}) 
</insert> 

này hoạt động khi tôi chạy ứng dụng nhưng các thử nghiệm đơn vị nhận được một lỗi:

org.springframework.jdbc.BadSqlGrammarException: Error selecting key or setting result to parameter object. Cause: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DUAL ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: DUAL

Như tôi hiểu 'DUAL' là một số loại ảo bảng trong Oracle lưu trữ các trình tự và tôi không có điều này trong cơ sở dữ liệu thử nghiệm của tôi. Nếu tôi xóa <selectKey> - gắn thẻ công việc kiểm tra đơn vị (vì HSQL có thể tự động tạo id cho các cột được đánh dấu là identity) nhưng không phải là ứng dụng thực. Một giải pháp khác là tạo các tệp XML bản đồ MyBatis riêng biệt cho các bài kiểm tra đơn vị mà không cần <selectKey> -tag nhưng điều này là không mong muốn vì tôi muốn kiểm tra cấu hình thực.

Có cách nào để tạo và sử dụng chuỗi trong HSQL hay không hoặc có thể giải pháp MyBatis cho việc này? Hoặc tôi nên sử dụng cơ sở dữ liệu khác cho thử nghiệm đơn vị của tôi như H2?


tôi sử dụng:

  • mùa xuân 3.0.5
  • HSQL 2.2.4
  • MyBatis 3.0.5

UPDATE:

Sau khi nhận được câu trả lời từ fredt, đây là cách tôi thay đổi nội dung cấu hình Spring tôi:

Trước khi tôi định nghĩa nguồn dữ liệu của tôi với:

<jdbc:embedded-database id="dataSource"> 
    <jdbc:script location="classpath:test-data/schema.sql" /> 
    <jdbc:script location="classpath:test-data/data.sql" /> 
</jdbc:embedded-database> 

Bây giờ tôi làm điều này:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> 
    <property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_ora=true" /> 
    <property name="username" value="sa" /> 
    <property name="password" value="" /> 
</bean> 

<jdbc:initialize-database data-source="dataSource"> 
    <jdbc:script location="classpath:test-data/schema.sql" /> 
    <jdbc:script location="classpath:test-data/data.sql" /> 
</jdbc:initialize-database> 

Ngoài ra, trong schema.sql tôi cần phải tạo các trình tự:

CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1; 
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1; 

(nếu bạn chạy tập lệnh này nhiều lần trong khi thử nghiệm đơn vị, hãy nhớ thêm drop sequence BASIS_SEQ if exists; lên trên cùng của schema.sql)

+1

Luwil: Bạn biết bạn có thể thêm câu trả lời cho câu hỏi của riêng bạn, nếu bạn muốn chia sẻ giải pháp bạn đã áp dụng cho câu hỏi của mình ... –

Trả lời

12

HSQLDB mới nhất cung cấp khả năng tương thích cú pháp Oracle rộng. Tất cả những gì bạn cần là thêm sql.syntax_ora=true vào URL cơ sở dữ liệu của bạn.Ví dụ:

jdbc:hsqldb:mem:test;sql.syntax_ora=true 

Xem Hướng dẫn

http://hsqldb.org/doc/2.0/guide/deployment-chapt.html

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

tương thích cú pháp SQL được liên tục mở rộng trong phiên bản mới của HSQLDB, vì vậy tốt nhất để sử dụng phiên bản mới nhất hiện có.

+0

Cảm ơn bạn @fredt, hoạt động như một sự quyến rũ. Đối với những người khác sử dụng Spring, tôi sẽ thêm văn bản vào câu hỏi của mình chi tiết cách tôi đã thay đổi cấu hình của mình (khó có được định dạng ngay trong nhận xét). – Luwil

2

Bạn vẫn có thể sử dụng cấu hình 4 dòng ban đầu của mình bằng cách sử dụng <jdbc:embedded-database ...>. Chỉ cần thêm dòng sau vào đầu kiểm tra dữ liệu tập tin/schema.sql của bạn:

SET DATABASE SQL SYNTAX ORA TRUE; 

Đây là effectivelly giống như phụ sql.syntax_ora=true đến URL JDBC của bạn.