jpa独立自定义类型映射/ javax.persistence.x替代org.hibernate.annotations.Type和org.hibernate.annotations.TypeDef
我在db中有一个表GameCycle
,它包含类型为number
的列date
。 此列中的值是8位数字,表示反向日期,如“ 20130301
”。 映射到这个表上我有一个类GameCycle
,它包含一个java.util.Date
类型的受保护字段iDate。 该字段使用自定义类型映射注释为“ @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, Serializable { @Type(type = "inverseDate") @Column(name = "GC_DATE", nullable = false) protected Date iDate = null; ...
显然,导入将我绑定到使用hibernate作为jpa实现,所以我的问题是:
有没有办法摆脱hibernate注释,并使用纯javax.persistence
解决方案进行相同的自定义类型映射?
当前版本的JPA规范不支持自定义类型映射。 这是未来JPA 2.1最受欢迎的function之一。
如果你真的想要摆脱特定于Hibernate的annoations,你唯一能做的就是将你的字段映射为String
并手动执行必要的转换(在getters / setters中)。
但实际上几乎每个基于JPA的大型应用程序都使用持久性提供程序的某些特定于实现的function,因此我认为在这种情况下避免依赖Hibernate并不重要。
最终在JPA 2.1 ( JSR-388 ,Java EE 7的一部分)中添加了自定义类型映射 。
不再需要Hibernate的@Type注释,可以用JPA 2.1中的Type Conversion替换。
JPA 2.1增加了:
- 注释@Convert
- 注释@Converts
- 注释@Converter
- 接口AttributeConverter
最基本的例子:( 示例1:转换基本属性 ) – 来自源
@Converter public class BooleanToIntegerConverter implements AttributeConverter { ... }
…
@Entity @Table(name = "EMPLOYEE") public class Employee { @Id private Long id; @Column @Convert(converter = BooleanToIntegerConverter.class) private boolean fullTime; }
其他链接:
- JPA 2.1中的类型转换
- JPA 2.1 – 如何实现类型转换器
- 使用JPA 2.1中的@Convert正确映射枚举
- 理解hibernate中的session.get vs session.load方法
- Java NoClassDefFound错误
- Hibernate和@JoinFormula:org.hibernate.mapping.Formula无法强制转换为org.hibernate.mapping.Column
- “没有给定标识符的行存在”,尽管它存在
- 使用hhnate的ehcache阻止装饰器
- 正确使用Entity和DTO以在Restful Web服务中提供Json
- JPA 2.0 Hibernate @OneToMany + @MapKeyJoinColumn
- hibernate列名称问题
- Hibernate Bi-Directional多对多关联创建重复