12

GameCycle在 db 中有一个表,其中包含一个datetype列number。此列中的值是 8 位数字,表示像“ 20130301”这样的倒数日期。映射到这张表上,我有一个类GameCycle,它包含一个类型为 iDate 的受保护字段java.util.Date。该字段使用自定义类型映射注释为“ @Type(type = "inverseDate")”。该类Gamecycle用' @TypeDef(name = "inverseDate", typeClass = InverseDateType.class)'注释

import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;

@Entity
@TypeDef(name = "inverseDate", typeClass = InverseDateType.class)
@Table(name = "GAMECYCLE")
public class GameCycle implements Comparable<GameCycle>, Serializable
{
    @Type(type = "inverseDate")
    @Column(name = "GC_DATE", nullable = false)
    protected Date iDate = null;
    ...

显然,导入将我绑定到使用 hibernate 作为 jpa 实现,所以我的问题是:

有没有办法摆脱休眠注释并使用纯javax.persistence解决方案进行相同的自定义类型映射?

4

2 回答 2

44

自定义类型映射终于被添加到JPA 2.1JSR-388,Java EE 7 的一部分)中。
Hibernate 的@Type注解不再需要,在 JPA 2.1 中可以用类型转换代替。

JPA 2.1 增加了:

最基本的示例:(示例1:转换基本属性)-来自源

@Converter
public class BooleanToIntegerConverter 
    implements AttributeConverter<Boolean, Integer> 
{  ... }

...

@Entity
@Table(name = "EMPLOYEE")
public class Employee
{

    @Id
    private Long id;

    @Column
    @Convert(converter = BooleanToIntegerConverter.class)
    private boolean fullTime;

}

其他链接:

于 2014-06-12T22:40:14.990 回答
8

否。当前版本的 JPA 规范不支持自定义类型映射。这是未来 JPA 2.1 最需要的功能之一。

如果您真的想摆脱特定于 Hibernate 的注释,您唯一能做的就是将您的字段映射为String并手动执行必要的转换(在 getter/setter 中)。

但在实践中,几乎每个基于 JPA 的大型应用程序都使用持久性提供程序的一些特定于实现的特性,因此我认为在这种情况下避免对 Hibernate 的依赖并不重要。

于 2013-04-12T14:36:26.173 回答