Jpa независимое настраиваемое сопоставление типов /javax.persistence.x альтернатива org.hibernate.annotations.Type и org.hibernate.annotations.TypeDef

У меня есть таблица GameCycle в db, которая содержит столбец date типа 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?

Ответ 1

Нет. Текущая версия спецификации JPA не поддерживает сопоставления пользовательских типов. Это одна из самых популярных функций для будущего JPA 2.1.

Если вы действительно хотите избавиться от аннотаций, связанных с Hibernate, единственное, что вы можете сделать, это отобразить ваше поле как String и выполнить необходимое преобразование вручную (в геттерах/сеттерах).

Но на практике почти каждое большое приложение на основе JPA использует некоторые специфические для реализации функции персистентности, поэтому я не думаю, что в этом случае действительно важно избегать зависимости от Hibernate.

Ответ 2

Пользовательское сопоставление типов было добавлено в JPA 2.1 (JSR-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;

}

Другие ссылки: