Подтвердить что ты не робот

HSQLDB и Hibernate/JPA - не сохраняются на диске?

Что-то из новичка с HSQL и Hibernate...

em.getTransaction().begin();
for (Activity theActivity : activities) {
  em.persist(theActivity);
}
em.getTransaction().commit();
em.close();

за которым следует...

EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
System.out.println("QUERY:: "
    + em.createQuery("SELECT COUNT(*) FROM " + Activity.class.getName()).getSingleResult()
        .toString());
em.getTransaction().commit();

Печатает 25000 (количество объектов Activity в действиях). Но когда я снова запускаю этот тест, количество объектов в счетчике (*) не увеличивается (и равно 0 в начале программы). Таким образом, объекты не набираются долгое время.

Это моя строка соединения hsqldb:

name="hibernate.connection.url" value="jdbc:hsqldb:file:data/cmon"

так что это не база данных в памяти, насколько я знаю...

Есть ли у кого-нибудь идеи, почему объекты не сохраняются за пределами одной сессии JVM? С удовольствием предоставляем больше информации, но там так много состояний, связанных с Hibernate/JPA/HSQL, что не ясно, что именно уместно.

4b9b3361

Ответ 1

Есть ли у кого-нибудь идеи, почему объекты не сохраняются за пределами одной сессии JVM?

HSQLDB не записывает изменения сразу на диск после фиксации (см. " ЗАПИСЬ ЗАПИСИ" ), HSQLDB по умолчанию не является Durable (это откуда происходят "спектакли" ).

Попробуйте установить свойство соединения shutdown=true в строке подключения, чтобы получить изменения, записанные при завершении последнего соединения.

jdbc:hsqldb:file:data/cmon;shutdown=true

Если это не поможет, попробуйте установить WRITE DELAY на 0 (или false). Если вы используете HSQLDB 1.8.x, используйте команду SQL:

SET WRITE_DELAY 0

Если вы используете HSQLDB 2.0.x, теперь вы также можете использовать соединение свойство hsqldb.write_delay:

jdbc:hsqldb:file:data/cmon;hsqldb.write_delay=false

Ответ 2

Решение:

<property name="dialect">org.hibernate.dialect.HSQLDialect</property>

в файле hibernate.cfg.xml


Это остальная часть моей конфигурации:

Libs:

  • HsqlDb 2.0.0
  • Hibernate 3.5.6

Адрес:

<property name="connection.url">jdbc:hsqldb:file:data/mydb;shutdown=true;hsqldb.write_delay=false;</property>

Ответ 3

Вы установили hibernate.hbm2ddl.auto в create-drop в свой файл persistence.xml? Это уменьшает ваши таблицы и воссоздает их при каждом запуске.

Вместо этого вы можете установить его на update или если вы хотите самостоятельно управлять схемой, установите для нее значение validate.

Ответ 4

Просто закройте свой EntityManagerFactory с помощью HSQL в файле, после фиксации, чтобы действительно сохранить данные...

Ответ 5

Я использовал версию 2.2.5 HSQL DB. Я пробовал выше подходы, то есть установку shutdown = true и hsqldb.write_delay = false Это не работает. Как было предложено в каком-то блоге, я добавил выражение

org.hsqldb.DatabaseManager.closeDatabases(0);

после совершения транзакции. Но это не сработало.

HSQL DB версии 2.2.9 кажется лучше этого. С помощью одного решения он решает эту проблему. Чтобы справиться с этой проблемой, выполните следующие действия: -

1) hsqldb.jar из библиотеки HSQL DB версии 2.2.9

2) В hibernate config xml просто укажите URL-адрес Я использую базу данных на основе файлов HSQL.

 <property name="hibernate.connection.url">jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB</property>

3) В вашей программе в конце записывается оператор

org.hsqldb.DatabaseManager.closeDatabases(0);

Теперь запустите программу спящего режима, которая передает данные в БД.

Проверьте базу данных HSQL, открыв ее в автономном режиме и с URL

jdbc:hsqldb:file:D:\JavaProj\TmpDBLocation\myKauDB

Вы должны увидеть, что ваши изменения сохраняются в БД.

Ответ 6

Закрытие sessionfactory работало для меня.