Produkt OpenJPA utrwala pola atrybutów typu java.sql.Date,
java.sql.Time lub java.sql.Timestamp, które mają
adnotację javax.persistence.Temporal, a produkt EclipseLink
zgłasza wyjątek.
Dla niektórych kombinacji adnotacji javax.persistence.Temporal i
atrybutów java.sql.Date, java.sql.Time oraz
java.sql.Timestamp należy dodać kod konwertera, tak aby
produkt EclipseLink był kompatybilny z tabelami utworzonymi przez produkt OpenJPA.
Ta reguła skanuje trzy kombinacje adnotacja-atrybut, w których wymagana jest klasa konwertera do transformacji danych między bazą danych a jednostką:
javax.persistence.Temporal(TemporalType.TIMESTAMP) w
atrybucie java.sql.Datejavax.persistence.Temporal(TemporalType.DATE) w
atrybucie java.sql.Timestampjavax.persistence.Temporal(TemporalType.TIME) w
atrybucie java.sql.Timestamp
W przypadkach, gdy nie jest wymagana konwersja i adnotacja
Temporal może zostać usunięta, patrz reguła
Usuń adnotację Temporal dla niektórych
atrybutów java.sql .
W tym przypadku reguła oznacza flagą adnotację
Temporal(TemporalType.TIMESTAMP).
@javax.persistence.Temporal(TemporalType).TIMESTAMP) prywatna java.sql.Date data;
Aby rozwiązać ten problem, należy utworzyć wspólną klasę programu narzędziowego konwertera, która może być używana dla wszystkich atrybutów potrzebujących tego konwertera:
Converter, która przekształca datę w znacznik
czasu, jak w poniższym przykładzie.
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) w atrybucie
java.sql.Date adnotacją Convert z atrybutem
converter ustawionym na nową klasę konwertera.
W poniższym przykładzie przedstawiona została oryginalna adnotacja
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 klasa publiczna TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.TIMESTAMP) private java.sql.Date sqlDateTIMESTAMP; }
W poniższym przykładzie przedstawiona została nowa adnotacja
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 klasa publiczna TemporalEntityOJ { @Id private int id; @Convert(converter=DateTimestampConverter.class) private java.sql.Date sqlDateTIMESTAMP; }
W tym przypadku reguła oznacza flagą adnotację
Temporal(TemporalType.DATE).
@javax.persistence.Temporal(TemporalType).DATE) private java.sql.Timestamp znacznik czasu;
Aby rozwiązać ten problem, należy utworzyć wspólną klasę programu narzędziowego konwertera, która może być używana dla wszystkich atrybutów potrzebujących tego konwertera:
Converter, która przekształca znacznik czasu w
datę, jak w poniższym przykładzie.
import java.sql.Date; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampDateAnnConverter implementuje AttributeConverter< Timestamp, Date> { @Override public Date convertToDatabaseColumn(Timestamp ts) { return new Date (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Date data) { return new Timestamp (date.getTime ()); } }
Temporal(TemporalType.DATE) w atrybucie
java.sql.Timestamp adnotacją Convert z atrybutem
converter ustawionym na nową klasę konwertera.
W poniższym przykładzie przedstawiona została oryginalna adnotacja
Temporal(TemporalType.DATE):
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity klasa publiczna TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.DATE) private java.sql.Timestamp sqlTimestampDate; }
W poniższym przykładzie przedstawiona została nowa adnotacja
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 klasa publiczna TemporalEntityOJ { @Id private int id; @Convert(converter=TimestampDateAnnConverter.class) private java.sql.Timestamp sqlTimestampDate; }
W tym przypadku reguła oznacza flagą adnotację
Temporal(TemporalType.TIME).
@javax.persistence.Temporal(TemporalType).TIME) prywatny java.sql.Timestamp znacznik czasu;
Aby rozwiązać ten problem, należy utworzyć wspólną klasę programu narzędziowego konwertera, która może być używana dla wszystkich atrybutów potrzebujących tego konwertera:
Converter, która przekształca znacznik czasu w
czas, jak w poniższym przykładzie.
import java.sql.Time; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter klasa publiczna TimestampTimeAnnConverter implementuje AttributeConverter< Timestamp, Time> { @Override public Time convertToDatabaseColumn(Timestamp ts) { return new Time (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Time) { return new Timestamp (time.getTime ()); } }
Temporal(TemporalType.TIME) w atrybucie
java.sql.Timestamp adnotacją Convert z atrybutem
converter ustawionym na nową klasę konwertera.
W poniższym przykładzie przedstawiona została oryginalna adnotacja
Temporal(TemporalType.TIME):
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity klasa publiczna TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime; }
W poniższym przykładzie przedstawiona została nowa adnotacja
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 klasa publiczna TemporalEntityOJ { @Id private int id; @Convert(converter=TimestampTimeAnnConverter.class) private java.sql.Timestamp sqlTimestampTime; }
Informacje na ten temat oraz na temat innych problemów z migracją interfejsu OpenJPA do interfejsu EclipseLink zawiera podręcznik Migracja interfejsu JPA ze środowiska OpenJPA do EclipseLink: Odwzorowania.