2012-08-06 62 views
0

我用Hibernate使用JPA 2。有兩個實體類,CardElementIdentityDocumentKind。最後一個是第一個的繼承實體。使用SINGLE_TABLE繼承策略。當我嘗試通過查詢from CardElement where id = '123456'選擇父類的一個實例,下面的錯誤occures:如何獲取父實體?

對象ID爲:123456是指定的子類的沒有: org.cp.cardsystem.CardElement(鑑別:SDocClass)

我沒有「SDocClass」鑑別符值的子類。實際上,在開發IdentityDocumentKind時,CardElement的等級查詢被廣泛用於整個應用程序。因此,我無法爲每個鑑別符值創建CardElement的子類,並在所有現有查詢中將CardElement替換爲它。這對我來說花費太多的努力。當使用SINGLE_TABLE繼承策略時,有沒有辦法實例化父實體類?

回答

0

問題解決了。我用這種方式註釋了繼承層次結構的根實體類(CardElement):@DiscriminatorValue(value = "not null")。現在我可以選擇這個類的對象,而不用爲每個鑑別器值創建子類。 not nullnull似乎是Hibernate的特殊鑑別值,它們在鑑別器列中分別匹配除null和null之外的任何值。我在Hibernate官方文檔中沒有找到關於這些值的任何信息。所以它可能是某種無證的功能。

1

我不確定是否正確理解您的問題。您正在使用Single Table策略來存儲整個繼承層次結構。然而,你只映射了一些鑑別器,而這一次,它是導致問題的未映射鑑別器(因爲Hibernate不知道該子類的含義)。我是否正確理解你的問題?

考慮針對特殊的數據庫視圖而不是實際的表。該視圖只顯示您可以處理的鑑別器記錄。

+0

是的,你已經正確理解我的問題。但使用這種數據庫視圖而不是表格會使所有帶有未映射辨別器的記錄無法通過CardElement訪問。 CardElement實體類提供處理所有現有數據的可能性非常重要。 – vect 2012-08-07 04:59:17

+0

但是,您希望如何提供訪問權限?你不想創建相應的孩子班,那麼你應該如何給予訪問?爲什麼你不能爲每個鑑別器的值創建一個子對象(即使它只是一個擴展你的父對象的空類也沒問題),或者,無論IdentityDocumentKind如何,都忘記繼承。只要將該字段視爲屬性 – 2012-08-07 06:35:58

+0

在創建IdentityDocumantKind時,我認爲可以處理具有未映射鑑別符的記錄作爲CardElement實例。我可以爲每個鑑別器值創建繼承實體。但是,在CardElement已經用於訪問數據的所有應用程序中,需要重構大量代碼。這個代碼在開發IdentityDocumentKind時已經存在。 – vect 2012-08-07 07:22:12