2015-04-20 25 views
5

Trong một dự án Java Tôi đang làm việc trên tôi đã có những thiết lập sau cho unit tests:Làm cách nào để gỡ lỗi xử lý giá trị hibernate.hbm2ddl.import_files được kết hợp với hsqldb?

  • Tôi đang sử dụng Spring MVC thử nghiệm, @RunWith(SpringJUnit4ClassRunner.class)@WebAppConfiguration để chạy các bài kiểm tra đơn vị, và tôi có thể tạo một MockMvc thể hiện bằng cách sử dụng webAppContextSetup(webApplicationContext) để kiểm tra ứng dụng.
  • Tôi có cấu hình Hibernate để thiết lập HSQLDB trong bộ nhớ, tất cả các bảng được tạo dựa trên các lớp @Entity.
  • Trong cấu hình Hibernate, tôi đang đặt thuộc tính hibernate.hbm2ddl.import_files để tải tệp import.sql bằng câu lệnh SQL để điền cơ sở dữ liệu (trong bộ nhớ).

Bây giờ, tôi đã xác nhận tất cả những công việc trên:

  • Các xét nghiệm có thể chèn thành công/lấy từ DB trong bộ nhớ.
  • Các câu lệnh SQL trong import.sql được thực thi, vì các thử nghiệm khác nhau xác nhận.

Bây giờ vấn đề: Lỗi xảy ra với tuyên bố tôi thêm trong import.sql dường như không được báo cáo ở bất cứ đâu, không phải là bất kỳ dấu hiệu cho rằng một lỗi xảy ra ở tất cả. Thay vào đó, các câu lệnh tiếp theo chỉ đơn giản là không được thực hiện. (Tôi đã xác nhận điều này thông qua thử nghiệm.)

Có cách nào hoặc đặt các lỗi này báo cáo rằng tôi dường như không biết? Có một tài sản Hibernate bổ sung cho điều này?

Trích từ bài kiểm tra Hibernate cấu hình:

<bean id="sessionFactory" name="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.archive.autodetection">class,hbm</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</prop> 
       <prop key="hibernate.connection.username">sa</prop> 
       <prop key="hibernate.connection.password"></prop> 
       <prop key="hibernate.connection.url">jdbc:hsqldb:mem:myschema</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.hbm2ddl.import_files">configuration/test/import.sql</prop> 
       <prop key="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</prop> 
       <!-- when using type="yes_no" for booleans, the line below allow booleans in HQL expressions: --> 
       <prop key="hibernate.query.substitutions">true 'Y', false 'N'</prop> 
      </props> 
     </property> 
    </bean> 

Trả lời

1

Không thực sự là một câu trả lời cho câu hỏi của bạn, nhưng cách khác để xử lý dân DB thử nghiệm.

Có một vùng tên XML trong Spring được gọi là jdbc cho phép bạn chuẩn bị sẵn cơ sở dữ liệu của mình với dữ liệu ban đầu trong khi khởi động bối cảnh mùa xuân. Ngoài ra, nó báo cáo lỗi trong các câu lệnh SQL của bạn tốt:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/jdbc 
     http://www.springframework.org/schema/jdbc/spring-jdbc.xsd"> 

    <jdbc:initialize-database data-source="dataSource"> 
     <jdbc:script location="org/mytestproject/schema-drop-hsqldb.sql" /> 
     <jdbc:script location="org/mytestproject/schema-hsqldb.sql" /> 
     <jdbc:script location="org/mytestproject/data-hsqldb.sql" /> 
    </jdbc:initialize-database> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="${jdbc.driver}"/> 
     <property name="url" value="${jdbc.url}"/> 
     <property name="username" value="${jdbc.username}"/> 
     <property name="password" value="${jdbc.password}"/> 
     <property name="validationQuery" value="${jdbc.validationQuery}"/> 
    </bean> 
</beans> 
+0

Cám ơn cung cấp thay thế này. Khi tôi thực hiện nó một lỗi xảy ra liên quan đến sự tồn tại của một bảng được sử dụng. Nó có thể được rằng phương pháp này thực hiện import.sql trước khi Hibernate tự động tạo ra các bảng? –

+0

Có, thêm phụ thuộc vào sessionFactory ngủ đông. Trong mẫu của tôi mùa xuân tạo ra và giảm bảng trực tiếp trong SQL – hoaz

+0

Thật không may tôi đang mắc kẹt với việc phải sử dụng tự động tạo của Hibernate ở đây ... Cảm ơn anyways mặc dù, bất kỳ đề xuất thêm được hoan nghênh! –

0

Bạn có thể kích hoạt đăng nhập trên lớp org.hibernate.tool.hbm2ddl.SchemaExport với cấp TRACE.

Một số lỗi được ghi lại ở mức DEBUG (ví dụ file không tìm thấy):

10:29:21,039 DEBUG SchemaExport:353 - Import file not found: ../myFile.sql 
Các vấn đề liên quan