2011-04-26 51 views
12

我試圖在遺留數據庫(仍然有遺留的PHP客戶機)上實現休眠,並且遇到一些問題,因爲編寫原始應用程序的人員沒有了解他們在做什麼。在處理遺留數據庫時丟失行上的休眠扼流圈

數據庫已設置爲沒有列可以爲空,所以如果沒有記錄,它們會將外鍵默認爲0。另外,他們在表上沒有適當的外鍵,所以有少數無效的ID。我沒有選擇更改架構或將適當的列置空。

這是我從休眠狀態時出現錯誤:

Caused by: org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.tv.platform.domain.Program#0] 

我想是處理這個渣土,其中場只會空,如果該行是無效或不存在的優雅的方式,但我沒有找到如何在文檔中處理這個問題的運氣。

任何提示?

回答

14

註釋: @NotFound(動作= NotFoundAction.IGNORE)

不正是我一直在尋找。我發現它經過這裏:

Hibernate Many-To-One Foreign Key Default 0

+1

我一直在尋找的起點。對於Hibernate映射文件,該屬性爲'not-found1'(例如:') – jdknight 2014-01-16 16:38:42

2

我不認爲Hibernate很適合這種類型的問題。 Hibernate期望表中的記錄相互關聯,如果只是有時強制執行外鍵關係,那麼它確實無法工作。我無法想象,通過這種方式更改或配置Hibernate 會很容易 - 知道如何處理破損的外鍵關係。

您可能會從MyBatis SQLMaps這樣的框架中獲得更多的里程數,其中您提供了用於將數據加載到程序外部的文件中的SQL語句,但該框架提供了鏈接SELECT語句的選項,以加載完整的對象圖。通過這種方式,您可以用邏輯補充SQL語句以過濾出0值。

+0

感謝您的建議,但我堅持了休眠。到目前爲止,我已經找到了_decent_解決方法,但如果我可以捕獲該特定的異常並將該字段置空,那將會很好。 – liam 2011-04-26 19:45:43

1

我認爲interceptor可能會伎倆。

+0

我檢出了攔截器,除了使用它們創建審計日誌的幾個例子之外,它似乎有點過於籠統。我在別處列出的註釋最終做了我想要的。 – liam 2011-04-26 21:24:22

0

我最近編寫了一個針對具有類似問題的遺留數據庫的web應用程序。如果你不想使用多個數據訪問框架,你仍然可以使用hibernate。我所做的就是使用'createSqlQuery'爲原始SQL查詢寫出棘手的部分。在某些情況下,我不得不將完整的子查詢或計算的值映射到實體屬性,但它有效。對於數據庫更加規則的部分,我仍然可以使用常規的Hibernate映射和條件/ HQL查詢。

另一件事:也許你應該避免使用像'不知道他們在做什麼'或'有點'的術語。我知道,很有可能會認爲前任留給你的任何代碼都很低劣,但要意識到這些人可能在當時做得最好。而且,你自己的代碼也不完美,所以有些謙遜。爲什麼?舉例來說,如果你並不是一直對他們認爲知識淵博的以前的開發人員感興趣,那麼你周圍的人可能會相處得更好。只是一個小費。

+0

你還沒有看過代碼庫。 – liam 2011-04-26 20:01:17

+0

你怎麼能確定我沒有?也許我寫了它。 – 2011-04-27 08:18:06