OpenJPA speichert die Felder von Attributen des Typs java.sql.Date, java.sql.Time und
java.sql.Timestamp, die eine Annotation javax.persistence.Temporal haben, persistent, wohingegen EclipseLink eine Ausnahme auslöst.
Für einige Kombinationen der Annotation javax.persistence.Temporal und der Attribute
java.sql.Date, java.sql.Time und
java.sql.Timestamp müssen Sie Converter-Code hinzufügen, damit
EclipseLink mit den von OpenJPA erstellten Tabellen kompatibel ist.
Diese Regel sucht nach drei Annotation-Attribut-Kombinationen, in denen eine Converter-Klasse erforderlich ist, um die Daten zwischen der Datenbank und der Entität zu transformieren:
javax.persistence.Temporal(TemporalType.TIMESTAMP)
in einem Attribut java.sql.Date javax.persistence.Temporal(TemporalType.DATE)
in einem Attribut java.sql.Timestamp javax.persistence.Temporal(TemporalType.TIME)
in einem Attribut java.sql.Timestamp
In den Fällen, in denen keine Konvertierung erforderlich ist und die Annotation Temporal entfernt werden kann, verwenden Sie die
Regel
Temporal-Annotation für einige java.sql-Attribute entfernen.
In diesem Fall markiert die Regel die Annotation Temporal(TemporalType.TIMESTAMP).
@javax.persistence.Temporal(TemporalType.TIMESTAMP)
private java.sql.Date date;
|
Zur Behebung dieses Problems erstellen Sie eine allgemeine Converter-Dienstprogrammklasse, die für alle Attribute verwendet werden kann, die diesen Converter benötigen:
Converter-Klasse, die ein Datum
in eine Zeitmarke konvertiert, wie im folgenden Beispiel gezeigt.
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) im Attribut
java.sql.Date durch eine Annotation Convert, in der das Attribut
converter auf die neue Converter-Klasse gesetzt ist.
Das folgende Beispiel zeigt die ursprüngliche Annotation 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 public class TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.TIMESTAMP) private java.sql.Date sqlDateTIMESTAMP; } |
Das folgende Beispiel zeigt die neue Annotation 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 public class TemporalEntityOJ { @Id private int id; @Convert(converter=DateTimestampConverter.class) private java.sql.Date sqlDateTIMESTAMP; } |
In diesem Fall markiert die Regel die Annotation Temporal(TemporalType.DATE).
@javax.persistence.Temporal(TemporalType.DATE)
private java.sql.Timestamp timestamp;
|
Zur Behebung dieses Problems erstellen Sie eine allgemeine Converter-Dienstprogrammklasse, die für alle Attribute verwendet werden kann, die diesen Converter benötigen:
Converter-Klasse, die eine Zeitmarke in ein Datum
konvertiert, wie im folgenden Beispiel gezeigt.
import java.sql.Date; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampDateAnnConverter implements 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) im Attribut
java.sql.Timestamp durch eine Annotation Convert, in der das Attribut
converter auf die neue Converter-Klasse gesetzt ist.
Das folgende Beispiel zeigt die ursprüngliche Annotation Temporal(TemporalType.DATE):
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.DATE) private java.sql.Timestamp sqlTimestampDate; } |
Das folgende Beispiel zeigt die neue Annotation 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 public class TemporalEntityOJ { @Id private int id; @Convert(converter=TimestampDateAnnConverter.class) private java.sql.Timestamp sqlTimestampDate; } |
In diesem Fall markiert die Regel die Annotation Temporal(TemporalType.TIME).
@javax.persistence.Temporal(TemporalType.TIME)
private java.sql.Timestamp timestamp;
|
Zur Behebung dieses Problems erstellen Sie eine allgemeine Converter-Dienstprogrammklasse, die für alle Attribute verwendet werden kann, die diesen Converter benötigen:
Converter-Klasse, die eine Zeitmarke in eine Zeitangabe
konvertiert, wie im folgenden Beispiel gezeigt.
import java.sql.Time; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampTimeAnnConverter implements AttributeConverter<Timestamp, Time>{ @Override public Time convertToDatabaseColumn(Timestamp ts) { return new Time(ts.getTime()); } @Override public Timestamp convertToEntityAttribute(Time time) { return new Timestamp(time.getTime()); } } |
Temporal(TemporalType.TIME) im Attribut
java.sql.Timestamp durch eine Annotation Convert, in der das Attribut
converter auf die neue Converter-Klasse gesetzt ist.
Das folgende Beispiel zeigt die ursprüngliche Annotation Temporal(TemporalType.TIME):
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity public class TemporalEntityOJ { @Id private int id; @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime; } |
Das folgende Beispiel zeigt die neue Annotation 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 public class TemporalEntityOJ { @Id private int id; @Convert(converter=TimestampTimeAnnConverter.class) private java.sql.Timestamp sqlTimestampTime; } |
Informationen zu diesem Problem und zu weiteren Problemen bei der Migration von OpenJPA auf EclipseLink finden Sie in der Veröffentlichung OpenJPA to EclipseLink JPA Migration: Mappings.