2012-07-23 85 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