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, что не ясно, что именно уместно.
Ответы
Ответ 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 работало для меня.