O OpenJPA persiste os campos dos atributos do tipo java.sql.Date, java.sql.Time, ou java.sql.Timestamp que possuem uma anotaçãojavax.persistence.Temporal, enquanto o EclipseLink lança uma exceção.
Para algumas combinações da anotação javax.persistence.Temporal e os atributos java.sql.Date, java.sql.Time e
java.sql.Timestamp, você deve incluir o código conversor de forma
que o EclipseLink seja compatível com as tabelas que foram criadas pelo OpenJPA.
Esta regra faz a varredura para encontrar três combinações de anotação-atributo nas quais uma classe conversora é necessária para transformar os dados entre o banco de dados e a entidade:
javax.persistence.Temporal(TemporalType.TIMESTAMP)
em um atributo java.sql.Datejavax.persistence.Temporal(TemporalType.DATE)
em um atributo java.sql.Timestampjavax.persistence.Temporal(TemporalType.TIME)
em um atributo java.sql.Timestamp
Para casos nos quais nenhuma conversão é necessária e a anotação Temporal
pode ser removida, veja a regra Remover anotação Temporal
para alguns atributos java.sql.
Neste caso, a regra sinaliza a anotação Temporal(TemporalType.TIMESTAMP).
@javax.persistence.Temporal(TemporalType.TIMESTAMP) private java.sql.Date data;
Para resolver este problema, crie uma classe de utilitário conversor comum que pode ser usada para todos os atributos que precisam deste conversor:
Converter que converte uma data em um
registro de data e hora, tal como o exemplo a seguir.
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) no
atributo java.sql.Date com uma anotação Convert que
possui o atributo converter configurado para a nova classe conversora.
O exemplo a seguir mostra a anotação 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 classe pública TemporalEntityOJ { @Id ID int privado ; @Temporal(TemporalType.TIMESTAMP) private java.sql.Date sqlDateTIMESTAMP;}
O exemplo a seguir mostra a nova anotação 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 classe pública TemporalEntityOJ { @Id ID int privado ; @Convert(converter=DateTimestampConverter.class) private java.sql.Date sqlDateTIMESTAMP;}
Neste caso, a regra sinaliza a anotação Temporal(TemporalType.DATE).
@javax.persistence.Temporal(TemporalType.DATE) registro de data e hora private java.sql.Timestamp ;
Para resolver este problema, crie uma classe de utilitário conversor comum que possa ser usada para todos os atributos que precisam deste conversor:
Converter que converte um registro de data
e hora em uma data, tal como o exemplo a seguir.
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(Registro de Data e Hora) { retorna nova Date (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Date) { retorna novo Timestamp (date.getTime ()); }}
Temporal(TemporalType.DATE) no
atributo java.sql.Timestamp com uma anotação Convert que
possui o atributo converter configurado para a nova classe conversora.
O exemplo a seguir mostra a anotação Temporal(TemporalType.DATE) original:
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity classe pública TemporalEntityOJ { @Id ID int privado ; @Temporal(TemporalType.DATE) privado java.sql.Timestamp sqlTimestampDate;}
O exemplo a seguir mostra a nova anotação 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 classe pública TemporalEntityOJ { @Id ID int privado ; @Convert(converter=TimestampDateAnnConverter.class) private java.sql.Timestamp sqlTimestampDate;}
Neste caso, a regra sinaliza a anotação Temporal(TemporalType.TIME).
@javax.persistence.Temporal(TemporalType.TIME) registro de data e hora private java.sql.Timestamp ;
Para resolver este problema, crie uma classe de utilitário conversor comum que possa ser usada para todos os atributos que precisam deste conversor:
Converter que converte um registro de data e hora para
um horário, tal como o exemplo a seguir.
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) { retorna novo Time (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Time time) { retorna novo Timestamp (time.getTime ()); }}
Temporal(TemporalType.TIME) no
atributo java.sql.Timestamp com uma anotação Convert que
possui o atributo converter configurado para a nova classe conversora.
O exemplo a seguir mostra a anotação Temporal(TemporalType.TIME) original:
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity classe pública TemporalEntityOJ { @Id ID int privado ; @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime;}
O exemplo a seguir mostra a nova anotação 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 classe pública TemporalEntityOJ { @Id ID int privado ; @Convert(converter=TimestampTimeAnnConverter.class) private java.sql.Timestamp sqlTimestampTime;}
Para obter informações sobre esse problema e outros problemas de migração do OpenJPA para o EclipseLink, consulte o guia Migração do OpenJPA para o EclipseLink JPA: mapeamentos.