2016-07-10 21 views
2

假設我已經創造了我希望堅持的課程。我無法更改它的代碼,即不能在其中添加任何註釋。此外,類不遵循bean約定。是否有可能在休眠中映射自定義的最終類?

I.e.它是任意複雜的類,我希望堅持下去。

是否有可能在Hibernate中編寫某種自定義序列化器和反序列化器(不知道如何命名),以便我可以像通常的POJO一樣讀取這些類?

+0

是實現序列化的最終類? –

+0

@PaulWasilewski,因爲你想序列化它的blob,然後沒有:) – Dims

+0

然後我想剩下的唯一選擇是映射類。 –

回答

0

你好,第一個問題是我可以映射一個「fina類」這個問題的答案是YES,只要你不使用Hibernate Enchancing或某種儀器。

現在第二個問題。 Bean不遵循豆約定。我想這意味着沒有獲得者和制定者。你可以有屬性級別訪問,所以這再次不是一個問題。

是否可以在Hibernate中編寫自定義串行器。這裏的答案是NO。爲什麼?因爲Hibernate不是關於序列化的,hibernate是關於SQL的。沒有嚴格的要求Hibernate實體應該可序列化。

即使Hibernate不強制序列化。即使它沒有實現Serializable或Eternalizeable,我仍然可以讓我的最終類可序列化。是的,你需要將它包裝到實現Serializable或Externalizeable的類中,並且自己實現doRead doWrite方法。

序列化爲JSON或XML - 這不是Hibernate的一部分,既不是JPA的一部分。這兩種格式的序列化被定義爲Jaxb和Jax-rs規範的一部分。

+0

看起來我們有誤解。以JSON和XML爲例,我們可以編寫自定義類來讀取和寫入結構化數據。在hibernate中類似的會很好:從/向數據庫表讀寫自定義類。 – Dims

0

看一看休眠UserTypeCompositeUserType,與衆所周知的EnumUserType example

枚舉有點像你的需求:final類,沒有干將也沒有setter方法。但它們並不複雜,因此您可能需要一個CompositeUserType,它允許爲一個類型映射多個列,而不是UserType

那麼你可以使用它一樣,在你的類:

public class MyClass { 
    @Id 
    private Long id; 

    @Type(type = "com...MyCompositeUserType") 
    private ComplexFinalClassNotPojo complexObject; 
} 
+0

看起來像這個工作只適用於領域。我想處理整個'MyClass'例子,而不添加註釋。 – Dims

+0

你不擁有和不能修改的類是我的例子中的ComplexFinalClassNotPojo。感謝CompositeUserType,可以將它映射到多個數據庫字段(MyClass表的所有列,但是「ID」列)。 MyClass是您擁有的代碼,並在您的項目中聲明。 MyClass將只包含表名和Id定義,它可以是基於'complexObject'內部狀態分配給用戶'@ Id'的用戶。 – Thierry