2012-07-23 86 views
2

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

其中的一些可以在某些情况下自动发生,但除非你被配置为自动做出来,你需要做的他们三人都在这条命令:

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

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

+0

我添加调用Session.flush()前提交()如你所说描述的,但什么都没有改变 - 数据库仍然是空的 – user1091733 2012-07-23 22:28:08

0

你可能忘了使用调用Session.flush()到你的对象保存到数据库之前commiting到数据库(session.getTransaction().commit())。 由于休眠参考自身状态:

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

而且也:

“法拉盛是同步的基础持久 存储与保存在内存中持久化状态的过程。”

编辑:

读一点关于HSQLDB后,我看到了一些东西,可以发生在你身上:

1 - 因为HSQLDB不是耐用缺省情况下(d来自'ACID'),它不会立即将数据保存到磁盘。我知道。不太可爱。因此,当最后一次连接完成时,您必须“强制”写入您的更改,请设置属性shutdown=true; 从用户指南:

您可以使用shutdown =真正的连接属性,以确保 数据库持久连接被关闭后完全。

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

因此,您在连接字符串中有这样的事情结束了:

;shutdown=true;hsqldb.write_delay=false; 

希望它能帮助!

+0

我改变我的代码如你所建议的,但它没有帮助。不知道发生了什么事。 – user1091733 2012-07-23 22:57:40

+0

好的。你可以用更多的细节来编辑你的文章吗?也许发布你的xml配置也不错。 – 2012-07-24 01:34:45

+0

我编辑了我的答案,再加一点。 – 2012-07-24 02:24:34

0

我的问题的解决方案是在第一注释下的问题在这个线程link

+0

但这正是我所说的,或不是?只是属性名称错误:hibernate.connection.url。来吧。 – 2012-07-27 19:05:25

+0

不是,我只需要添加Thread.sleep(1000),因为JVM关闭得太快了。 – user1091733 2012-07-27 20:10:10

+0

哎呀,对不起。我以为你说的答案是“第一个答案”,但它是“在第一个评论”。 – 2012-07-27 20:20:58