2011-11-01 19 views
9

Estoy intentando usar una base de datos en memoria para simular una base de datos de teradata. Necesito crear un esquema antes de que se construyan las tablas, sin embargo, me está dando ajustes.Guión de inicio para crear un esquema en HSQLDB

Estoy usando Spring y tengo mucha interacción con la base de datos con import.sql, sin embargo, esto se ejecuta después de que Hibernate ha creado todas las tablas. Intenté utilizar el archivo .script que HSQLDB debe leer, pero creo que cuando utilizas una base de datos en memoria no funciona. He movido un poco los archivos y parece que nada parece golpear.

¿Alguien descubrió cómo crear un esquema al inicio para una base de datos HSQLDB en memoria?

Respuesta

5

Si ejecuta la secuencia de comandos de esta manera ...

<?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-3.0.xsd 
     http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"> 


<jdbc:embedded-database id="dataSource" type="H2" > 
    <jdbc:script location="classpath:my.sql" />  
</jdbc:embedded-database> 

... entonces se ejecuta antes de Hibernate hace su trabajo de inicialización.


Lo he probado nuevamente, especialmente para ti. Se ejecuta antes de que Hibernate cree las tablas. Ver este registro (ejecutando la secuencia de comandos se encuentra en las 3 primeras líneas, Hibernate en los últimos):

2011-11-01 19:10:08,380 [main] INFO org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory - Creating embedded database 'dataSource' 
2011-11-01 19:10:08,583 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator - Executing SQL script from class path resource [my.sql] 
2011-11-01 19:10:08,683 [main] INFO org.springframework.jdbc.datasource.init.ResourceDatabasePopulator - Done executing SQL script from class path resource [my.sql] in 100 ms. 
2011-11-01 19:10:08,683 [main] INFO org.springframework.context.support.GenericApplicationContext - Bean 'dataSource' of type [class org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
2011-11-01 19:10:08,683 [main] INFO org.springframework.context.support.GenericApplicationContext - Bean 'dataSource' of type [class org.springframework.jdbc.datasource.SimpleDriverDataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
2011-11-01 19:10:08,700 [main] INFO org.springframework.context.support.GenericApplicationContext - Bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#35712651' of type [class org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 
2011-11-01 19:10:08,717 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean - Building JPA container EntityManagerFactory for persistence unit 'testH2DbPersistenceUnit' 
2011-11-01 19:10:08,854 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final 
2011-11-01 19:10:08,859 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.6.7.Final 
2011-11-01 19:10:08,861 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found 
... 
2011-11-01 19:10:10,313 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - Running hbm2ddl schema update 
2011-11-01 19:10:10,313 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - fetching database metadata 
2011-11-01 19:10:10,315 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - updating schema 
+0

Esto ocurre después de que todo haya terminado. Respuesta incorrecta. Lo siento. Pero es genial ... – markthegrea

+0

@markthegrea: Extraño, cuando lo intento, se hace antes de que hibernate cree las tablas. Para probarlo, he adjuntado los registros. Entonces tu problema debe ser algo más. -- Respuesta correcta. – Ralph

+0

Ralph, lo descubrí. Estaba poniendo el código que me diste DESPUÉS de que se creó el origen de datos. Me llevó algo de tiempo obtener el registro de Spring, pero la ubicación definitivamente marcó la diferencia. Si lo coloca ANTES del xml de la fuente de datos, funciona según lo anunciado. No sabía que el orden hizo una diferencia en Spring. Además, Spring parece tener por defecto "jdbc: hsqldb: mem: testdb", específicamente, "testdb". Estaba nombrando el mío de manera diferente y Spring estaba iniciando "testdb" en la memoria. Cuando cambié el mío a "testdb", bingo, todo funcionó bien. ¡Gracias! – markthegrea

0

Puede utilizar un archivo: base de datos con todos los datos en la memoria y no altere escrito por su prueba . Esto debería servir para tu propósito.

Primero cree el esquema de la base de datos con la URL jdbc:hsqldb:file:initdata y realice SHUTDOWN. A continuación, añadir files_readonly=true al archivo initdata.properties o alternativamente usar la URL a continuación:

jdbc:hsqldb:file:initdata;files_readonly=true 

Cuando las pruebas se ejecutan en contra de esta base de datos, nada está escrito a los archivos de base de datos y todos los datos están en la memoria.

Cuestiones relacionadas