2015-04-20 23 views
5

In un progetto Java su cui sto lavorando io ho la seguente configurazione per i nostri test unitari:Come posso eseguire il debug dell'elaborazione del valore hibernate.hbm2ddl.import_files combinato con hsqldb?

  • sto usando Primavera test MVC, @RunWith(SpringJUnit4ClassRunner.class) e @WebAppConfiguration per eseguire i test di unità, e creo un Istanza MockMvc utilizzando webAppContextSetup(webApplicationContext) per testare l'applicazione.
  • Ho una configurazione Hibernate per configurare un HSQLDB in memoria, tutte le tabelle sono create in base alle classi @Entity.
  • Nella configurazione di Hibernate, sto impostando la proprietà hibernate.hbm2ddl.import_files per caricare un file import.sql con istruzioni SQL per popolare il database (in memoria).

Ora, ho confermato tutti questi sopra lavoro:

  • I test possono inserire/recuperare dal DB in memoria con successo.
  • Le istruzioni SQL nel numero import.sql vengono eseguite, come confermano vari test.

Ora il problema : Gli errori che si verificano con le dichiarazioni aggiungo in import.sql non sembrano essere segnalato da nessuna parte, nessuno dei due è alcuna indicazione, dato che si è verificato un errore a tutti. Invece, le dichiarazioni successive non sono semplicemente eseguite. (Ho confermato questo attraverso test.)

C'è qualche modo o luogo questi errori sono segnalato che sono apparentemente inconsapevole di? C'è una proprietà aggiuntiva di Hibernate per questo?

Estratto dal test di ibernazione config:

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

risposta

1
Non

davvero una risposta alla tua domanda, ma modo alternativo di gestire prova popolazione DB.

C'è uno spazio dei nomi XML in primavera chiamato jdbc che consente di prepopolare il database con i dati iniziali durante l'avvio del contesto di primavera. Inoltre segnala errori nei SQLs bene:

<?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

Grazie per l'offerta di questa alternativa. Quando lo implemento si verifica un errore relativo alla non esistenza di una tabella utilizzata. Potrebbe essere che questo metodo esegua import.sql prima che Hibernate crei automaticamente le tabelle? –

+0

Sì, l'aggiunta dipende dalla sospensione sessionFactory. Nel mio esempio Spring crea e rilascia tabelle direttamente in SQL – hoaz

+0

Sfortunatamente sono bloccato a dover utilizzare la creazione automatica di Hibernate qui ... Grazie comunque, ogni ulteriore suggerimento è benvenuto! –

0

È possibile attivare la registrazione sul classe org.hibernate.tool.hbm2ddl.SchemaExport con livello di traccia.

Alcuni errori vengono registrati a livello DEBUG (ad esempio File non trovato):

10:29:21,039 DEBUG SchemaExport:353 - Import file not found: ../myFile.sql 
Problemi correlati