Создание схемы из файла sql выглядит нормально, но таблицы не найдены

#java #jpa #h2 #in-memory-database

Вопрос:

В persistence.xml Я создаю базу данных (базу данных в памяти для тестирования), как это:

 <persistence-unit name="TestDatabase" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jar-file>pathToMyJar.jar</jar-file>
    <properties>            
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />            
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.archive.autodetection" value="class, hbm" />
        <property name="javax.persistence.schema-generation.database.action" value="create"/>           
    </properties>
</persistence-unit>
 

Это работает, как и ожидалось, но медленно. Поэтому я сохранил sql-скрипт для генерации схемы, как это:

 <persistence-unit name="TestDatabase" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jar-file>pathToMyJar.jar</jar-file>
    <properties>            
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />            
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.archive.autodetection" value="class, hbm" />
        <property name="javax.persistence.schema-generation.database.action" value="create"/>  
        <property name="javax.persistence.schema-generation.scripts.action" value="create"/>
        <property name="javax.persistence.schema-generation.scripts.create-target" value="pathToSchemaGeneratonScript.sql"/>
    </properties>
</persistence-unit>
 

А потом попытался использовать его вот так:

 <persistence-unit name="TestDatabase" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>            
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
        <property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test" />
        <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />            
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.show_sql" value="true" />
        <property name="javax.persistence.schema-generation.database.action" value="create"/>            
        <property name="javax.persistence.schema-generation.create-source" value="script"/>            
        <property name="javax.persistence.schema-generation.create-script-source" value="pathToSchemaGeneratonScript.sql"/>
    </properties>
</persistence-unit>
 

Поскольку show_sql имеет значение true, я вижу, что скрипт запускается, например, «создать таблицу xxx (…».
Но, похоже, никаких таблиц не существует, например:

 entityManagerFactory = Persistence.createEntityManagerFactory("TestDatabase");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
Query query = entityManager.createNativeQuery("insert into xxx (someColumns) values (someValues)");
query.executeUpdate();
 

Приведет к «org.hibernate.engine.jdbc.spi.SqlExceptionHelper — Таблица «xxx» не найдена».
Я подключился вручную и убедился, что таблиц там нет. Я также применил сгенерированный файл sql вручную, а затем таблицы были созданы, как и ожидалось.