Спящий режим не сохраняет данные в H2 JBoss 7.1.1

В настоящее время я работаю над JBoss 7.1.1 с JPA (с Hibernate) и Spring. У меня есть весна @Transactional, чтобы позаботиться о транзакциях. В настоящее время я использую внутренний H2 database JBoss 7.1.1. Все транзакции работают нормально, когда сервер работает. Но как только я выключил свой сервер, все изменения, внесенные в объектные компоненты, не сохраняются в файлах базы данных H2 при перезагрузке сервера JBoss. После выключения сервера JBoss, когда я подключаюсь к базе данных H2 с помощью файлов, я вижу, что схема создана, но данные не сохраняются.

Я чувствую, что проблема не в моем коде, а в некоторой конфигурации, потому что он отлично работает, когда приложение работает.

Вот мой файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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="myappname" transaction-type="JTA">
        <jta-data-source>java:/DefaultDS</jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="jboss.entity.manager.factory.jndi.name" value="java:app/myappname"/>
        </properties>
    </persistence-unit>

</persistence>

Источник данных в standalone.xml:

<datasource jta="true" jndi-name="java:/DefaultDS" pool-name="DefaultDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:h2:file:${jboss.server.data.dir}${/}h2${/}localDB</connection-url>
    <driver>h2</driver>
    <pool>
        <min-pool-size>5</min-pool-size>
        <max-pool-size>20</max-pool-size>
    </pool>
    <security>
        <user-name>sa</user-name>
    </security>
    <timeout>
        <idle-timeout-minutes>0</idle-timeout-minutes>
    </timeout>
    <statement>
        <prepared-statement-cache-size>32</prepared-statement-cache-size>
    </statement>
</datasource>

Как я могу заставить это работать?

заранее спасибо


person Chris    schedule 18.09.2012    source источник
comment
Я не уверен, но не могли бы вы попробовать принудительно использовать абсолютный путь, я думаю, что это будет jdbc:h2:file:/${jboss.server.data.dir}/h2/localDB или, может быть, jdbc:h2:file:${/}${jboss.server.data.dir}${/}h2${/}localDB (не уверен, что / почему нужно использовать ${/} вместо просто /).   -  person Thomas Mueller    schedule 18.09.2012
comment
@ThomasMueller Спасибо за ответ. Забыл вас обновить. Я попробовал то, что вы предложили. Вроде не работает :-(   -  person Chris    schedule 18.09.2012
comment
Я все еще думаю, что URL-адрес базы данных является проблемой. Я бы протестировал с полностью жестко заданным URL-адресом базы данных, например: jdbc:h2:file:/data/jboss/h2/localDB.   -  person Thomas Mueller    schedule 18.09.2012


Ответы (2)


Единственное, что выглядит необычным в показанной конфигурации файла persistence.xml и источника данных, — это путь к базе данных, однако я попробовал вашу конфигурацию в JBoss AS 7.1.1 с аналогичным путем к базе данных и не смог воспроизвести проблему. Я определенно могу получить доступ к данным, сохраняемым приложением, даже после перезапуска или выключения сервера. Однако мое приложение не использует Spring; возможно, проблема заключается в конфигурации Spring или где-то еще? Вы уверены, что подключаетесь к тому же файлу базы данных H2, который использует ваше приложение?

person Katie J. Ots    schedule 24.09.2012

в вашем файле hibernate.cfg.xml у вас должно быть

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

вместо create, который всегда удаляет и заново создает таблицу, используйте validate.

<property name="hibernate.hbm2ddl.auto">validate</property>
person Sebastian Brestin    schedule 02.08.2014