我照顾commiting交易,但数据库仍然保存对象之后空。没有错误,休眠甚至显示插入的SQL命令。一切都OK了,当我添加<property name="hibernate.connection.autocommit">true</property>
线到我的休眠配置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();
其中的一些可以在某些情况下自动发生,但除非你被配置为自动做出来,你需要做的他们三人都在这条命令:
Session.save()
更新从JVM中对象的Hibernate的看法。Session.flush()
通过发出SQL语句更新对象的数据库的视图。Session.getTransaction().commit()
犯数据库的事务。见http://docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/Session.html#flush()
你可能忘了你的对象保存到使用调用Session.flush(数据库)之前commiting到数据库(session.getTransaction().commit()
)。由于Hibernate参考本身的规定:
强制此会话刷新。必须在工作单元的末端被调用,提交事务和关闭会话之前(取决于冲洗模式,器transaction.commit()调用此方法)。
并且:
“刷新是同步与保存在存储器中可持久状态底层持久存储的过程”。
编辑:
读一点关于HSQLDB后,我看到了一些东西,可以发生在你身上:
1 - 由于HSQLDB是不是默认(从“ACID”的d)耐用,它不会立即持久化数据到磁盘。我知道。不那么可爱。所以,你必须“强迫”当最后一个连接完成后,设置属性shutdown=true
更改的写入;从用户指南:
您可以使用shutdown =真正的连接属性,以确保数据库的连接被关闭后,完全保留。
2 - 为了让您的更改立即写入磁盘使用属性hsqldb.write_delay=false
;
所以,你与你的连接字符串中像这样结束:
;shutdown=true;hsqldb.write_delay=false;
希望能帮助到你!
我的问题的解决方案是在第一注释下的问题在这个线程link描述