Estaba haciendo un ejemplo de JPA, Hibernate y H2. Y estaba intentando que al arrancar el ejemplo se crease la BBDD en base a las entidades JPA y a la misma vez ejecutase un script para añadir datos a la misma.
Mi configuración inicial era la siguiente:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="es.home.example.jpa.config"> <class>es.home.example.pojo.Book</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="create" /> <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> <property name="javax.persistence.jdbc.url"
value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;
INIT=create schema if not exists test\;
RUNSCRIPT FROM 'classpath:script/data.sql'\;" /> <property name="javax.persistence.jdbc.user" value="sa" /> <property name="javax.persistence.jdbc.password" value="" /> </properties> </persistence-unit> </persistence>
Estaba usando la propiedad 'hibernate.hbm2ddl.auto' a 'true', por lo que me crearía la BBDD al iniciarla en base a las entidades creadas (en este caso la entidad 'Book'). Y además en la cadena de conexión de H2 habiamos indicado que al iniciar se crease el esquema 'test' si no existiese y que se ejecutase un script (data.sql) almacenado en la carpeta 'script' del classpath (src/main/resources).
Pero al arrancar la aplicación, me daba error debido a que estaba intentando ejecutar el script 'data.sql' (con inserts en la tabla 'Book') antes de crear la propia tabla.
La solución: Pasa por hacer ambas cosas a través de hibernate. Es decir, que sea la propia Hibernate la que se encargue de crear la BBDD (cosa que ya tenemos configurada) y la encargada de ejecutar un fichero que nos permita iniciar con datos dicha BBDD. ¿Pero como?.
Podemos hacerlo de dos formas, pero en ambas partimos de que debemos quitar la parte de la configuración de H2 para ejecutar el script.
Pero al arrancar la aplicación, me daba error debido a que estaba intentando ejecutar el script 'data.sql' (con inserts en la tabla 'Book') antes de crear la propia tabla.
La solución: Pasa por hacer ambas cosas a través de hibernate. Es decir, que sea la propia Hibernate la que se encargue de crear la BBDD (cosa que ya tenemos configurada) y la encargada de ejecutar un fichero que nos permita iniciar con datos dicha BBDD. ¿Pero como?.
Podemos hacerlo de dos formas, pero en ambas partimos de que debemos quitar la parte de la configuración de H2 para ejecutar el script.
- La primera es creando un fichero 'import.sql' en el classpath y almacenando en el todas las sentencias SQL que queremos que se ejecuten.
- Indicando los scripts y el orden de los mismos que queremos que se ejecuten mediante otra propiedad de hibernate 'hibernate.hbm2ddl.import_files'. Antentos que esta solo se puede usar si la propiedad 'hibernate.hbm2ddl.auto' esta puesta a 'create' o 'create-drop'
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="es.home.example.jpa.config"> <class>es.home.example.pojo.Book</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.hbm2ddl.auto" value="create" /> <property name="hibernate.hbm2ddl.import_files" value="script/data.sql" />
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;" /> <property name="javax.persistence.jdbc.user" value="sa" /> <property name="javax.persistence.jdbc.password" value="" /> </properties> </persistence-unit> </persistence>
No hay comentarios:
Publicar un comentario