Заменить аннотацию Temporal на аннотацию Converter у некоторых атрибутов java.sql

OpenJPA сохраняет поля атрибутов типа java.sql.Date, java.sql.Time или java.sql.Timestamp, имеющих аннотацию javax.persistence.Temporal, а EclipseLink генерирует исключительную ситуацию.

Для некоторых сочетаний аннотации javax.persistence.Temporal с атрибутами java.sql.Date, java.sql.Time и java.sql.Timestamp необходимо добавить код преобразователя, обеспечивающий совместимость EclipseLink с таблицами, созданными OpenJPA.

Это правило находит три сочетания аннотации и атрибута, для которых требуется класс преобразователя для преобразования данных из формата базы данных в формат сущности и наоборот:

В тех случаях, когда преобразование не требуется, и можно удалить аннотацию Temporal обратитесь к описанию правила Удалить аннотацию Temporal для некоторых атрибутов java.sql.

@Temporal(TemporalType.TIMESTAMP) в атрибуте java.sql.Date

В этом случае правило отмечает аннотацию Temporal(TemporalType.TIMESTAMP).

   @javax.persistence.Temporal(TemporalType.TIMESTAMP)
   частная датаjava.sql.Date ;

Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:

  1. Создайте класс Converter для преобразования даты в системное время, как показано в следующем примере.
    import java.sql.Date;
    import java.sql.Timestamp;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    
    import javax.persistence.AttributeConverter;
    import javax.persistence.Converter;
    
    @Converter
    public class DateTimestampConverter implements AttributeConverter<Date, Timestamp> {
        @Override
        public Timestamp convertToDatabaseColumn(Date date) {
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.set(Calendar.HOUR_OF_DAY, 0);
            cal.set(Calendar.MINUTE, 0);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);
            return new Timestamp(cal.getTime().getTime());
        }
    
        @Override
        public Date convertToEntityAttribute(Timestamp timestamp) {
            return new Date(timestamp.getTime());
        }
    }
    
  2. Добавьте класс преобразователя в определение единицы хранения.
  3. Замените аннотацию Temporal(TemporalType.TIMESTAMP) в атрибуте java.sql.Date на аннотацию Convert с атрибутом converter, в котором задан новый класс преобразователя.

    Ниже приведен пример исходной аннотации Temporal(TemporalType.TIMESTAMP):

    import javax.persistence.Convert;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Temporal(TemporalType.TIMESTAMP)
        private java.sql.Date sqlDateTIMESTAMP; }
    

    Ниже приведен пример новой аннотации Convert:

    import javax.persistence.Convert;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=DateTimestampConverter.class)
        private java.sql.Date sqlDateTIMESTAMP; }
    

@Temporal(TemporalType.DATE) в атрибуте java.sql.Timestamp

в этом случае правило отмечает аннотацию Temporal(TemporalType.DATE).

   @javax.persistence.Temporal(TemporalType.DATE)
   личный отметка времениjava.sql.Timestamp ;

Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:

  1. Создайте класс Converter для преобразования системного времени в дату, как показано в следующем примере.
    import java.sql.Date;
    импорт java.sql.Timestamp;
    import javax.persistence.AttributeConverter;
    import javax.persistence.Converter;
    
    @Converter
    public class TimestampDateAnnConverter реализует AttributeConverter< Отметка времени, Date> {
        @Override
        public Date convertToDatabaseColumn(Timestamp ts) {
            return new Date (ts.getTime ());
        *
    
        @Override
        public Timestamp convertToEntityAttribute(Дата даты) {
            return new Timestamp (date.getTime ());
        } }
    
  2. Добавьте класс преобразователя в определение единицы хранения.
  3. Замените аннотацию Temporal(TemporalType.DATE) в атрибуте java.sql.Timestamp на аннотацию Convert с атрибутом converter, в котором задан новый класс преобразователя.

    Ниже приведен пример исходной аннотации Temporal(TemporalType.DATE):

    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Temporal(TemporalType.DATE)
        private java.sql.Timestamp sqlTimestampDate; }
    

    Ниже приведен пример новой аннотации Convert:

    import javax.persistence.Convert;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=TimestampDateAnnConverter.class)
        private java.sql.Timestamp sqlTimestampDate; }
    

@Temporal(TemporalType.TIME) в атрибуте java.sql.Timestamp

в этом случае правило отмечает аннотацию Temporal(TemporalType.TIME).

   @javax.persistence.Temporal(TemporalType.TIME)
   частная отметка времениjava.sql.Timestamp

Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:

  1. Создайте класс Converter для преобразования системного времени во время, как показано в следующем примере.
    import java.sql.Time;
    импорт java.sql.Timestamp;
    import javax.persistence.AttributeConverter;
    import javax.persistence.Converter;
    
    @Converter
    public class TimestampTimeAnnConverter implements AttributeConverter< Отметка времени, Time> {
        @Override
        public Time convertToDatabaseColumn(Timestamp ts) {
            return new Time (ts.getTime ());
        *
    
        @Override
        public Timestamp convertToEntityAttribute(Time time) {
            return new Timestamp (time.getTime ());
        } }
    
  2. Добавьте класс преобразователя в определение единицы хранения.
  3. Замените аннотацию Temporal(TemporalType.TIME) в атрибуте java.sql.Timestamp на аннотацию Convert с атрибутом converter, в котором задан новый класс преобразователя.

    Ниже приведен пример исходной аннотации Temporal(TemporalType.TIME):

    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Temporal(TemporalType.TIME)
        private java.sql.Timestamp sqlTimestampTime; }
    

    Ниже приведен пример новой аннотации Convert:

    import javax.persistence.Convert;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=TimestampTimeAnnConverter.class)
        private java.sql.Timestamp sqlTimestampTime; }
    

Для получения дополнительной информации об этой проблеме и других проблемах, возникающих при миграции OpenJPA в EclipseLink, обратитесь к руководству Миграция OpenJPA в EclipseLink JPA: преобразования.