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.
Это правило находит три сочетания аннотации и атрибута, для которых требуется класс преобразователя для преобразования данных из формата базы данных в формат сущности и наоборот:
javax.persistence.Temporal(TemporalType.TIMESTAMP) в атрибуте java.sql.Datejavax.persistence.Temporal(TemporalType.DATE) в атрибуте java.sql.Timestampjavax.persistence.Temporal(TemporalType.TIME) в атрибуте java.sql.Timestamp
В тех случаях, когда преобразование не требуется, и можно удалить аннотацию
Temporal обратитесь к описанию правила
Удалить аннотацию Temporal для некоторых атрибутов java.sql.
В этом случае правило отмечает аннотацию Temporal(TemporalType.TIMESTAMP).
@javax.persistence.Temporal(TemporalType.TIMESTAMP)
частная датаjava.sql.Date ;
Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:
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()); } }
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).
@javax.persistence.Temporal(TemporalType.DATE)
личный отметка времениjava.sql.Timestamp ;
Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:
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 ()); } }
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).
@javax.persistence.Temporal(TemporalType.TIME)
частная отметка времениjava.sql.Timestamp
Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:
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 ()); } }
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: преобразования.