Sustituya la anotación temporal con una anotación de conversor para algunos atributos java.sql

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:

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.

@Temporal(TemporalType.TIMESTAMP) en un atributo java.sql.Date

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:

  1. Cree una clase 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());
        }
    }
    
  2. Añada la clase de convertidor a la definición de unidad de persistencia.
  3. Sustituya la anotación 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;}
    

@Temporal(TemporalType.DATE) en un atributo java.sql.Timestamp

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:

  1. Cree una clase 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 ());
        }}
    
  2. Añada la clase de convertidor a la definición de unidad de persistencia.
  3. Sustituya la anotación 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;}
    

@Temporal(TemporalType.TIME) en un atributo java.sql.Timestamp

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:

  1. Cree una clase 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 ());
        }}
    
  2. Añada la clase de convertidor a la definición de unidad de persistencia.
  3. Sustituya la anotación 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.