OpenJPA persiste los campos de atributos del tipo java.sql.Date, java.sql.Time, o
java.sql.Timestamp que tienen una anotación javax.persistence.Temporal, mientras que EclipseLink lanza una excepción.
Para algunas combinaciones de la anotación javax.persistence.Temporal y los atributos java.sql.Date, java.sql.Time y java.sql.Timestamp, debe añadir un código conversor de modo que EclipseLink es compatible con las tablas que se han creado por OpenJPA.
Esta regla examina tres combinaciones de anotación-atributo donde es necesaria una clase de conversor para transformar los datos entre la base de datos y la entidad:
javax.persistence.Temporal(TemporalType.TIMESTAMP) en un atributo java.sql.Datejavax.persistence.Temporal(TemporalType.DATE) en un atributo java.sql.Timestampjavax.persistence.Temporal(TemporalType.TIME) en un atributo java.sql.Timestamp
Para los casos donde no es necesaria ninguna conversión y la anotación Temporal se puede eliminar, consulte la regla
Eliminar anotación temporal para algunos atributos java.sql.
En este caso, la regla señala la anotación Temporal(TemporalType.TIMESTAMP).
@javax.persistence.Temporal(TemporalType.TIMESTAMP) private java.sql.Date date;
Para resolver este problema, cree una clase de programa de utilidad de conversor común que se puede utilizar para todos los atributos que necesitan este conversor:
Converter que convierte una indicación de fecha a hora como, por ejemplo, el ejemplo siguiente.
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) en el atributo java.sql.Date con una anotación Convert que tiene el atributo converter establecido en la nueva clase de conversor.
El ejemplo siguiente muestra la anotación Temporal(TemporalType.TIMESTAMP) original:
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 clase pública TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.TIMESTAMP) private java.sql.Date sqlDateTIMESTAMP;}
El ejemplo siguiente muestra la nueva anotación 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 clase pública TemporalEntityOJ { @Id private int id; @Convert(converter=DateTimestampConverter.class) private java.sql.Date sqlDateTIMESTAMP;}
En este caso, la regla señala la anotación Temporal(TemporalType.DATE).
@javax.persistence.Temporal(TemporalType.DATE) private java.sql.Timestamp indicación de fecha y hora;
Para resolver este problema, cree una clase de programa de utilidad de conversor común que se puede utilizar para todos los atributos que necesitan este conversor:
Converter que convierte una indicación de tiempo a fecha como, por ejemplo, el ejemplo siguiente.
import java.sql.Date; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampDateAnnConverter implementa AttributeConverter< Timestamp, Date> { @Override public Date convertToDatabaseColumn(Timestamp ts) { return new Date (ts.getTime ()); } @Override Public Indicación de fecha y hora convertToEntityAttribute(Date date) { return new Timestamp (date.getTime ()); }}
Temporal(TemporalType.DATE) en el atributo java.sql.Timestamp con una anotación Convert que tiene el atributo converter establecido en la nueva clase de conversor.
El ejemplo siguiente muestra la anotación Temporal(TemporalType.DATE) original:
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity clase pública TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.DATE) private java.sql.Timestamp sqlTimestampDate;}
El ejemplo siguiente muestra la nueva anotación 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 clase pública TemporalEntityOJ { @Id private int id; @Convert(converter=TimestampDateAnnConverter.class) private java.sql.Timestamp sqlTimestampDate;}
En este caso, la regla señala la anotación Temporal(TemporalType.TIME).
@javax.persistence.Temporal(TemporalType.TIME) private java.sql.Timestamp indicación de fecha y hora;
Para resolver este problema, cree una clase de programa de utilidad de conversor común que se puede utilizar para todos los atributos que necesitan este conversor:
Converter que convierte una indicación de tiempo a una hora como, por ejemplo, el ejemplo siguiente.
import java.sql.Time; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampTimeAnnConverter implementa AttributeConverter< Timestamp, Time> { @Override public Time convertToDatabaseColumn(Timestamp ts) { return new Time (ts.getTime ()); } @Override public Indicación de fecha y hora convertToEntityAttribute(Hora) { return new Indicación de fecha y hora (time.getTime ()); }}
Temporal(TemporalType.TIME) en el atributo java.sql.Timestamp con una anotación Convert que tiene el atributo converter establecido en una nueva clase de conversor.
El ejemplo siguiente muestra la anotación Temporal(TemporalType.TIME) general:
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity clase pública TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime;}
El ejemplo siguiente muestra la nueva anotación 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 clase pública TemporalEntityOJ { @Id private int id; @Convert(converter=TimestampTimeAnnConverter.class) private java.sql.Timestamp sqlTimestampTime;}
Si desea más información sobre este problema y otros problemas de migración de OpenJPA a EclipseLink, consulte la guía Migración de OpenJPA a EclipseLink JPA: Correlaciones.