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)
private java.sql.Date 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)
private java.sql.Timestamp timestamp;
|
Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:
Converter для преобразования системного времени в дату, как показано в следующем примере.
import java.sql.Date; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampDateAnnConverter implements AttributeConverter<Timestamp, Date>{ @Override public Date convertToDatabaseColumn(Timestamp ts) { return new Date(ts.getTime()); } @Override public Timestamp convertToEntityAttribute(Date date) { 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)
private java.sql.Timestamp timestamp;
|
Для решения этой проблемы создайте общий класс утилиты преобразователя, который может использоваться для всех атрибутов, которым требуется такой преобразователь:
Converter для преобразования системного времени во время, как показано в следующем примере.
import java.sql.Time; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampTimeAnnConverter implements AttributeConverter<Timestamp, 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: преобразования.