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;
}
Другие ссылки: