OpenJPA conserva i campi degli attributi di tipo java.sql.Date, java.sql.Time o java.sql.Timestamp che hanno un'annotazione javax.persistence.Temporal, mentre EclipseLink genera un'eccezione.
Per alcune combinazioni dell'annotazione javax.persistence.Temporal e degli attributi java.sql.Date, java.sql.Time e java.sql.Timestamp, è necessario aggiungere del codice di conversione in modo che EclipseLink sia compatibile con le tabelle create da OpenJPA.
Questa regola ricerca tre combinazioni di annotazione-attributo in cui è necessaria una classe converter per trasformare i dati tra il database e l'entità:
javax.persistence.Temporal(TemporalType.TIMESTAMP) in un attributo java.sql.Datejavax.persistence.Temporal(TemporalType.DATE) in un attributo java.sql.Timestampjavax.persistence.Temporal(TemporalType.TIME) in un attributo java.sql.Timestamp
Per i casi in cui non è necessaria alcuna conversione e l'annotazione Temporal può essere rimossa, consultare la regola Rimozione dell'annotazione Temporal per alcuni attributi java.sql.
In questo caso, la regola contrassegna l'annotazione Temporal(TemporalType.TIMESTAMP).
@javax.persistence.Temporal(TemporalType.TIMESTAMP) data privata java.sql.Date ;
Per risolvere questo problema, creare una classe di utilità di conversione comune che può essere utilizzata per tutti gli attributi che necessitano di questa conversione:
Converter che converta una data in una data/ora, come nel seguente esempio.
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) nell'attributo java.sql.Date con un'annotazione Convert che abbia l'attributo converter impostato con la nuova classe converter.
Il seguente esempio mostra l'annotazione Temporal(TemporalType.TIMESTAMP) originale:
import javax.persistence.Convert; importa javax.persistence.Entity; Importazione javax.persistence.Id; import javax.persistence.Table; Importa javax.persistence.Temporal; Importa javax.persistence.TemporalType; @Entity Classe pubblica TemporalEntityOJ { @Id int privato id; @Temporal(TemporalType.TIMESTAMP) privato java.sql.Date sqlDateTIMESTAMP;}
Il seguente esempio mostra la nuova annotazione Convert:
import javax.persistence.Convert; importa javax.persistence.Entity; Importazione javax.persistence.Id; import javax.persistence.Table; Importa javax.persistence.Temporal; Importa javax.persistence.TemporalType; @Entity Classe pubblica TemporalEntityOJ { @Id int privato id; @Convert(converter=DateTimestampConverter.class) privato java.sql.Date sqlDateTIMESTAMP;}
In questo caso, la regola contrassegna l'annotazione Temporal(TemporalType.DATE).
@javax.persistence.Temporal(TemporalType.DATE) private java.sql.Timestamp ;
Per risolvere questo problema, creare una classe di utilità di conversione comune che può essere utilizzata per tutti gli attributi che necessitano di questa conversione:
Converter che converta una data/ora in una data, come nel seguente esempio.
importazione java.sql.Date; import java.sql.Timestamp; Importazione 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 Timestamp convertToEntityAttribute(Date date) { return new Timestamp (date.getTime ()); }}
Temporal(TemporalType.DATE) nell'attributo java.sql.Timestamp con un'annotazione Convert che abbia l'attributo converter impostato con la nuova classe converter.
Il seguente esempio mostra l'annotazione Temporal(TemporalType.DATE) originale:
importa javax.persistence.Entity; Importazione javax.persistence.Id; Importa javax.persistence.Temporal; Importa javax.persistence.TemporalType; @Entity Classe pubblica TemporalEntityOJ { @Id int privato id; @Temporal(TemporalType.DATE) privato java.sql.Timestamp sqlTimestampDate;}
Il seguente esempio mostra la nuova annotazione Convert:
import javax.persistence.Convert; importa javax.persistence.Entity; Importazione javax.persistence.Id; import javax.persistence.Table; Importa javax.persistence.Temporal; Importa javax.persistence.TemporalType; @Entity Classe pubblica TemporalEntityOJ { @Id int privato id; @Convert(converter=TimestampDateAnnConverter.class) privato java.sql.Timestamp sqlTimestampDate;}
In questo caso, la regola contrassegna l'annotazione Temporal(TemporalType.TIME).
@javax.persistence.Temporal(TemporalType.TIME) private java.sql.Timestamp ;
Per risolvere questo problema, creare una classe di utilità di conversione comune che può essere utilizzata per tutti gli attributi che necessitano di questa conversione:
Converter che converta una data/ora in un'ora, come nel seguente esempio.
import java.sql.Time; import java.sql.Timestamp; Importazione javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter Classe pubblica TimestampTimeAnnConverter implementa AttributeConverter< Timestamp, Time> { @Override public Time convertToDatabaseColumn(Timestamp ts) { restituisce il nuovo Time (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Ora) { return new Timestamp (time.getTime ()); }}
Temporal(TemporalType.TIME) nell'attributo java.sql.Timestamp con un'annotazione Convert che abbia l'attributo converter impostato con la nuova classe converter.
Il seguente esempio mostra l'annotazione Temporal(TemporalType.TIME) originale:
importa javax.persistence.Entity; Importazione javax.persistence.Id; Importa javax.persistence.Temporal; Importa javax.persistence.TemporalType; @Entity Classe pubblica TemporalEntityOJ { @Id int privato id; @Temporal(TemporalType.TIME) privato java.sql.Timestamp sqlTimestampTime;}
Il seguente esempio mostra la nuova annotazione Convert:
import javax.persistence.Convert; importa javax.persistence.Entity; Importazione javax.persistence.Id; import javax.persistence.Table; Importa javax.persistence.Temporal; Importa javax.persistence.TemporalType; @Entity Classe pubblica TemporalEntityOJ { @Id int privato id; @Convert(converter=TimestampTimeAnnConverter.class) privato java.sql.Timestamp sqlTimestampTime;}
Per informazioni su questo problema e altri problemi della migrazione da OpenJPA a EclipseLink, consultare la guida OpenJPA to EclipseLink JPA Migration: Mappings.