要解釋hibernate的錯誤,就必須完全了解hibernate的執行流程,和他需要的一些資訊(主要就是一些配置檔案)
在hibernate内部,不知道Person是一個持久化類
錯誤之一:在hibernate.cfg.xml檔案中,沒有把person的映射檔案加進去
錯誤原因:
表不存在
根據持久化類和映射檔案沒有建立表
在hibernate.cfg.xml中,得配<propertyname="hbm2ddl.auto">update</property>才能讓hibernate幫你建立表
session.get方法調用的是該對象預設的構造函數建立對象的,是以是以一個持久化類中必須得保證有一個預設的構造函數
這是由于hibernate是是根據OID來差別兩個對象的,必須保證不同的對象的OID不一樣。
在hibernate的配置檔案中,映射檔案的路徑或者名稱寫錯了
錯誤原因:因為在映射檔案中才要查找持久化類,是以如果持久化類找不到,肯定是映射檔案的問題在映射檔案中class元素的name屬性的值寫錯了
hibernate中的session.get方法的第二個參數的類型應該和相應的持久化類的辨別符類型相比對
這可能就是由于該字段不支援自動增長,需要設定自動增長
錯誤原因:在映射檔案中,該對象的主鍵的生成機制是assigned,但是在程式中卻沒有指派
錯誤分析:
通過映射檔案可以知道:classes與student是一對多的關系通過該代碼可以看出在儲存classes的時候要儲存student
顯示儲存:隻要session.save操作了一個對象,就是顯示儲存
隐式儲存:不在程式中做儲存的動作,而交給hibernate來做
隻有在classes.hbm.xml檔案中
<set name="students"cascade="save-update">存在cascade屬性 hibernate才要做隐式操作
如果沒有寫cascade屬性,在儲存classes的時候,student仍然是臨時狀态。在兩個對象關聯的時候,進行儲存的時候,hibernate不允許有臨時狀态的對象的出現
錯誤原因:映射檔案和持久化類中的屬性不比對
錯誤原因:沒有找到關聯的類Classes.hbm.xml檔案中關聯student,是以在這裡沒有在classes.hbm.xml檔案中找到student
錯誤的根本原因:就是主外鍵的限制 外鍵(jdbc)--->inverse(hibernate)
産生對象利用的是懶加載的模式,但是并沒有把實際的内容加載出來,而這個時候session關閉了