使用Hibernate不会将数据插入HSQLDB数据库

时间:2012-07-23 21:50:31

标签: java database hibernate hsqldb

我负责提交事务,但保存对象后数据库仍为空。没有错误,hibernate甚至显示插入的SQL命令。当我将<property name="hibernate.connection.autocommit">true</property>行添加到我的hibernate配置xml时,一切正常,但我听说这不是一个好习惯。我正在使用HSQLDB数据库。

这是我的代码插入数据。

    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 个答案:

答案 0 :(得分:0)

在某些情况下,其中一些可能会自动发生,但除非您配置为自动执行,否则您需要按此顺序执行所有这三项操作:

  1. Session.save()从JVM内部更新Hibernate对象的视图。
  2. Session.flush()通过发出SQL语句来更新数据库的对象视图。
  3. Session.getTransaction().commit()在数据库中提交事务。
  4. 请参阅http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#flush()

答案 1 :(得分:0)

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

  

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

还有:

  

“刷新是同步基础持久性的过程   持久存在的商店。“

修改

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

1 - 因为默认情况下HSQLDB不是持久(来自'ACID'的D),所以它不会立即将数据持久保存到磁盘。我知道。不太可爱所以你必须在最后一次连接完成后“强制”写下你的更改,设置属性shutdown=true; 来自用户指南:

  

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

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

所以,你最终会在你的连接字符串中找到类似的东西:

;shutdown=true;hsqldb.write_delay=false;

希望它有所帮助!

答案 2 :(得分:0)

我的问题的解决方案在此主题link

中的第一个评论中有所描述

答案 3 :(得分:0)

有时在通过代码进行更改时向连接字符串添加 ;shutdown=true 无济于事。

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

您的查询应如下所示:

SQLQuery query = session.createSQLQuery("SHUTDOWN SCRIPT");