Невозможно создать схему для initialize-database, если hsqlbd находится в режиме сервера - PullRequest
4 голосов
/ 24 октября 2011

У меня есть Hsqldb 1) в памяти

<jdbc:embedded-database id="idtSimulatorDataSource" type="HSQL">
        <jdbc:script location="classpath:hsql/idt_schema.sql"/>
    </jdbc:embedded-database>

2) в режиме сервера

<bean id="idtSimulatorDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost:9001/idt_simulatordb"/>
    </bean>

1) все работает правильно 2) не может создать схему.Если я создаю схему вручную, то hibernate создает все необходимые манипуляции DDL, и everethyng тоже работает правильно.Но я не знаю, где я должен назначить свойство для сценария инициализации БД

Вот мой файл персистентности

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="IDTSimulator" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <class>com.nxsystems.simulator.idt.domain.IDTAccount</class>
        <class>com.nxsystems.simulator.idt.domain.IDTCard</class>
        <class>com.nxsystems.simulator.idt.domain.IDTCurrency</class>
        <class>com.nxsystems.simulator.idt.domain.IDTCardHolder</class>
        <class>com.nxsystems.simulator.idt.domain.IDTProgram</class>
        <class>com.nxsystems.simulator.idt.domain.IDTTransaction</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <properties>
            <!-- -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.default_schema" value="simulators"/>
            <!-- -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <!-- -->
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
            <property name="hibernate.cache.use_query_cache" value="false"/>
            <property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.EhCacheRegionFactory"/>
            <!-- -->
            <!--<property name="hibernate.hbm2ddl.auto" value="create"/>-->
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.connection.pool_size" value="10"/>


        </properties>
    </persistence-unit>
</persistence>

А вот мой скрипт файла инициализации

DROP SCHEMA IF EXISTS simulators CASCADE;
CREATE SCHEMA SIMULATORS AUTHORIZATION SA -- not work yet
CREATE TABLE SIMULATORS.dirtyhack();

Может быть, было бы лучше создать схему автоматически, но я не знаю, как

ОБНОВЛЕНИЕ Я нашел способ запустить сценарий инициализации db:

jdbc: initialize-database data-source = "idtSimulatorDataSource">

Также я установил

<property name="hibernate.hbm2ddl.auto" value="create"/>

Но теперь у меня появляется следующая ошибка:

11:15:57,337  WARN (main) [JDBCExceptionReporter] SQL Error: -5501, SQLState: 42501
11:15:57,370 ERROR (main) [JDBCExceptionReporter] user lacks privilege or object not found: IDT_CARD

http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/rzala/rzalastc.html

SQLSTATE Value:      42501  
Meaning: The authorization ID does not have the privilege to perform the specified operation on the identified object.

Что такое привилегии ?????

ОБНОВЛЕНИЕ: Теперь я действительно запутался.Я смотрю в журнал.И см. Следующее:

/ C2 / SET SCHEMA СХЕМА ОБЩЕСТВЕННОГО ПРЕКРАЩЕНИЯ, ЕСЛИ ВЫСТАВЛЯЕТСЯ СИСТЕМАМИ CASATE CREATE SCHEMA SIMULATORS AUTHORIZATION SA CREATE TABLE SIMULATORS.dirtyhack () DISCONNECT / / SET SCHEMA PUBLIC DISCONNECT / C4 / SET SCHEMA PUBLIC DROP SCHEMA ЕСЛИ СУЩЕСТВУЮТ симуляторы CASCADE CREATE SCHEMA СИМУЛЯТОРЫ АВТОРИЗАЦИЯ SA DISCONNECT / C5 1050 * SSCEMC PUB1051 * / SET SCHEMA PUBLIC

Но я недавно изменил свой скрипт инициализации:

DROP SCHEMA IF EXISTS simulators CASCADE;
CREATE SCHEMA SIMULATORS AUTHORIZATION sa -- not work yet
CREATE TABLE SIMULATORS.dirtyhack1();

Где находится моя таблица dirtyhack1 () ???Я удалил все упоминания о предыдущих запусках

ОБНОВЛЕНИЕ

Я нашел причину.Этот блок выполняется после того, как Hibernate создает свои манипуляции DDL:

<jdbc:embedded-database id="idtSimulatorDataSource" type="HSQL">
        <jdbc:script location="classpath:hsql/idt_schema.sql"/>
    </jdbc:embedded-database>

И мой код содержит такие строки:

public static Server server = new Server();

    @AfterClass
    public static void tearDown1() throws Exception {
        server.shutdown();
    }


    @BeforeClass
    public static void setUp() throws Exception {
        HsqlProperties p = new HsqlProperties();
        p.setProperty("server.database.0", "file:./idt_simulatordb");
        p.setProperty("server.dbname.0", "idt_simulatordb");
        p.setProperty("server.port", "9001");
        server.setProperties(p);
        server.start();

        Connection conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9001/idt_simulatordb", "sa", "");
        conn.setAutoCommit(true);
        Statement st = conn.createStatement();    // statements
        String expression1 = "DROP SCHEMA IF EXISTS simulators CASCADE;\n";
        (1)String expression2 = "CREATE SCHEMA SIMULATORS AUTHORIZATION SA;";
        String expression3 = "CREATE TABLE SIMULATORS.dirtyhack1();";
        st.executeUpdate(expression1);    // run the query
        st.executeUpdate(expression2);    // run the query
        st.executeUpdate(expression3);    // run the query
        st.close();
        conn.close();
    }

Вот почему я не нашел свою таблицу dirtyhack1, и поэтомуЯ получил ошибку.Init-database только что удалила мою схему симуляторов

Так что есть вопрос.Как запустить скрипт инициализации перед Hibernate?Потому что, если я не напишу строку (1), я получаю ошибку об ошибке экспорта схемы

1 Ответ

1 голос
/ 04 апреля 2013

Вы можете использовать Spring EmbeddedDatabaseBuilder для создания базы данных.Примерно так:

new EmbeddedDatabaseBuilder().addScript("classpath:hsql/idt_schema.sql").build();

Тогда вам не нужен Hibernate для создания схемы, потому что она уже существует.

...