jpa independent custom type mapping / javax.persistence.x 替代 org.hibernate.annotations.Type and org.hibernate.annotations.TypeDef

2022-09-04 23:50:21

我在数据库中有一个表,其中包含一列类型。此列中的值是 8 位数字,表示反向日期,如 ''。映射到此表我有一个类,其中包含类型的受保护字段iDate。该字段使用自定义类型映射进行批注“”。该类用 ' 进行注释GameCycledatenumber20130301GameCyclejava.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;
    ...

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

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


答案 1

自定义类型映射终于被添加到 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;

}

其他链接 :


答案 2

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

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

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


推荐