2012年5月4日 星期五

Hibernate + HSQLDB 炸裂

測試環境:Hibernate 4.1.2、HSQLDB 2.2.8、Java 1.6

抓了兩個 H 的最新版,結果前後炸了四五個小時才能開始塞資料。茲紀錄如下。

大抵上是參考 《Hibernate 學習筆記》 (中文嘛...... [毆飛]),只不過 database 改成用 HSQLDB Server 版。

第一個遇到的問題是:只要一作 session.beginTransaction(),Hibernate 就會炸「No suitable driver found for jdbc:hsqldb:hsql://localhost/DBNAME」,最後找到的解法是在建立 Configuration 之前就先執行「Class.forName("org.hsqldb.jdbc.JDBCDriver")」。(參考資料:Hibernate forum

順便補一下,似乎在 Hibernate 4 以後 Configuration.buildSessionFactory() 就被 deprecated 掉,不過(到目前為止)使用起來還是正常。至於標準寫法我沒研究,可參見 stackoverflow

第二個遇到的問題是 session.save() 時 HSQLDB 會炸「user lacks privilege or object not found」,據說如果用 Hibernate 3.6 跟 HSQLDB 1.8 就不會有這種困擾...... Orz。這篇提到要將 Hibernate 的 hibernate.hbm2ddl.auto 設定為 create,實際上要設定成 update。參數之間差別如下:(參考資料:Hibernate reference
  • create:系統 init 時會作檢查 table 是否存在,有的話就會 drop 掉重建。
  • validate:只有在 table 存在時,系統才能正常 init。
  • update:理想狀況,init 時沒 table 會建,有 table 就續用。(不過如果系統運作中有外力 drop table,則會出錯)

做了這些手腳之後,目前 save() 之後東西都會乖乖進資料庫了。於是又寫一篇可能沒多久之後就沒意義的 debug / 教學文...... 軟體業阿...... [遠目]

沒有留言:

張貼留言