3

I took care of commiting transaction, but database remains empty after saving object. No errors, hibernate even shows SQL command of inserting. Everything is ok when I add <property name="hibernate.connection.autocommit">true</property> line to my hibernate config xml, but I heard that this is not a good practice. I'm using HSQLDB database.

Here's piece of my code that inserts data.

    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    Client c = new Client();
    c.setImie("John");
    c.setNazwisko("Kennedy"); 
    session.save(c);
    session.getTransaction().commit();
    session.close();
4

4 回答 4

0

其中一些可以在某些情况下自动发生,但除非您配置为自动执行它们,否则您需要按以下顺序执行所有三个:

  1. Session.save()从 JVM 内部更新 Hibernate 的对象视图。
  2. Session.flush()通过发出 SQL 语句更新数据库的对象视图。
  3. Session.getTransaction().commit()提交数据库中的事务。

http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#flush ()

于 2012-07-23T22:15:47.297 回答
0

在提交到数据库 ( ) 之前,您可能忘记使用session.flush()session.getTransaction().commit()将对象保存到数据库中。正如 Hibernate 参考本身所说:

强制此会话刷新。必须在工作单元结束时调用,在提交事务和关闭会话之前(取决于刷新模式,Transaction.commit() 调用此方法)。

并且:

“刷新是将底层持久存储与内存中保存的持久状态同步的过程。”

编辑:

在阅读了一些关于 HSQLDB 的内容后,我看到了一些可能发生在你身上的事情:

1 - 因为 HSQLDB 默认不是Durable('ACID' 中的 D),它不会立即将数据持久化到磁盘。我知道。没那么可爱。因此,当最后一个连接完成时,您必须“强制”写入您的更改,设置属性shutdown=true;从用户指南:

您可以使用 shutdown=true 连接属性来确保数据库在连接关闭后完全持久化。

2 - 要使您的更改立即写入磁盘,请使用该属性hsqldb.write_delay=false

所以,你最终会在你的连接字符串中得到这样的东西:

;shutdown=true;hsqldb.write_delay=false;

希望能帮助到你!

于 2012-07-23T22:36:51.757 回答
0

我的问题的解决方案在此线程链接的问题下的第一条评论中进行了描述

于 2012-07-27T17:33:33.533 回答
0

通过代码进行更改时,有时添加;shutdown=true到您的连接字符串并没有帮助。

因此,每次您通过 HSQLDB 中的代码进行更改(插入、删除、更新等)时,只需从您的代码中手动运行查询“SHUTDOWN SCRIPT”。这将正确关闭 HSQLDB 并立即保存.properties.script文件中的更改。

您的查询应如下所示:

SQLQuery query = session.createSQLQuery("SHUTDOWN SCRIPT");
于 2021-01-30T20:15:26.260 回答