2016-07-10 16 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