如何让Hibernate调用我的自定义typedef?

时间:2010-09-28 18:38:57

标签: hibernate annotations typedef hibernate-annotations

我正在尝试定义CompositeUserType来处理我的JPA / Hibernate应用程序中的特定类型。我有一个名为ApplicationMessageType的CompositeUserType,用于处理我的映射。

根据我所读到的,我应该能够在包含TypeDef的域层次结构中创建一个package-info.java类。我看起来像这样:

@TypeDefs({
    @TypeDef(
        defaultForType = ApplicationMessage.class,
        typeClass = ApplicationMessageType.class
    )
})
package mptstp.domain;

import mptstp.domain.messages.ApplicationMessage;

import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;

如果我理解正确,我正在使用DefaultDeType参数到TypeDef,每当我尝试保存或加载ApplicationMessage时,都应该调用自定义类型代码。

我已经在ApplicationMessageType类中的每个方法上设置了断点,并且没有任何永远被调用。

有谁知道我哪里出错了?代码编译,但似乎从未调用TypeDef注释来注册ApplicationMessageType。

任何指针都会非常感激......

由于

1 个答案:

答案 0 :(得分:2)

  

我正在尝试定义CompositeUserType来处理我的JPA / Hibernate应用程序中的特定类型。我有一个名为ApplicationMessageType的CompositeUserType,用于处理我的映射。

请注意,您必须在字段或属性级别为复合用户类型声明列(使用@Columns注释)。

  

根据我读过的内容,我应该能够在包含TypeDefs的域层次结构中创建一个package-info.java类。

这是正确的,当在多个实体中使用自定义类型时,这是推荐的策略。

  

如果我理解正确,我正在使用DefaultDeType参数到TypeDef,每当我尝试保存或加载ApplicationMessage时,都应该调用自定义类型代码。

理论上,defaultForType元素意味着当Hibernate遇到类ApplicationMessage的属性时,应该将持久性策略委托给自定义映射类型ApplicationMessageType

但是我确定这对于复合用户类型是如何工作的,我不确定你是否必须重复@Type来声明@Columns(在这种情况下,你应在name)中声明TypeDef别名。

  

有谁知道我哪里出错了?代码编译,但似乎从未调用TypeDef注释来注册ApplicationMessageType ..

不能说。您是否真的成功地持有具有类ApplicationMessage属性的实体或者根本没有?也许显示一个带注释的实体。

参考

资源