我在数据库中有一个表GameCycle
,其中包含date
类型的列number
。此列中的值是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<GameCycle>, Serializable
{
@Type(type = "inverseDate")
@Column(name = "GC_DATE", nullable = false)
protected Date iDate = null;
...
显然,导入将我绑定到使用hibernate作为jpa实现,所以我的问题是:
有没有办法摆脱hibernate注释并使用纯javax.persistence
解决方案进行相同的自定义类型映射?
答案 0 :(得分:35)
自定义类型映射。
不再需要Hibernate的@Type注释,可以在JPA 2.1中用类型转换替换。
JPA 2.1补充道:
最基本的例子:(示例1:转换基本属性) - from source
@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;
}
其他链接:
答案 1 :(得分:7)
没有。当前版本的JPA规范不支持自定义类型映射。这是未来JPA 2.1最受欢迎的功能之一。
如果您真的想要摆脱特定于Hibernate的annoations,您唯一能做的就是将您的字段映射为String
并手动执行必要的转换(在getter / setter中)。
但实际上几乎每个基于JPA的大型应用程序都使用持久性提供程序的某些特定于实现的功能,因此我认为在这种情况下避免依赖Hibernate并不重要。