我负责提交事务,但保存对象后数据库仍为空。没有错误,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();
答案 0 :(得分:0)
在某些情况下,其中一些可能会自动发生,但除非您配置为自动执行,否则您需要按此顺序执行所有这三项操作:
Session.save()
从JVM内部更新Hibernate对象的视图。Session.flush()
通过发出SQL语句来更新数据库的对象视图。Session.getTransaction().commit()
在数据库中提交事务。请参阅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");