Az OpenJPA tárolja a javax.persistence.Temporal annotációval
ellátott java.sql.Date, java.sql.Time vagy
java.sql.Timestamp típusú attribútumok mezőit, míg ez
EclipseLink egy kivételt dob.
A javax.persistence.Temporal annotáció és a
java.sql.Date, a java.sql.Time és a
java.sql.Timestamp attribútumok néhány kombinációja
esetén hozzá kell adnia átalakító kódot, hogy az EclipseLink kompatibilist
legyen az OpenJPA által létrehozott táblákkal.
Ez a szabály ellenőrzi a három annotáció-attribútum kombinációt, ahol egy átalakító osztály szükséges az adatok adatbázis és egyed közötti átalakításához:
javax.persistence.Temporal(TemporalType.TIMESTAMP)
annotáció egy java.sql.Date attribútumonjavax.persistence.Temporal(TemporalType.DATE) annotáció
egy java.sql.Timestamp attribútumonjavax.persistence.Temporal(TemporalType.TIME) annotáció
egy java.sql.Timestamp attribútumon
Azokban az esetekben, amikor nincs szükség átalakításra, a
Temporal annotáció eltávolítható (lásd a
Temporal annotáció eltávolítása bizonyos java.sql attribútumokból
szabályt).
Ebben az esetben a szabály megjelöli a
Temporal(TemporalType.TIMESTAMP) annotációt.
@javax.persistence.Temporal(TemporalType.TIMESTAMP)
private java.sql.Date date;
|
A probléma megoldása érdekében hozzon létre egy általános átalakító segédprogram osztályt, amely felhasználható az átalakítót igénylő összes attribútumhoz:
Converter osztályt, amely átalakít
egy dátumot időpecsétté, ahogy a következő példában látható.
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()); } } |
java.sql.Date attribútum
Temporal(TemporalType.TIMESTAMP) annotációját egy
Convert annotációra, amelyben a converter
attribútum az új Converter osztályra van beállítva.
A következő példa az eredeti Temporal(TemporalType.TIMESTAMP)
annotációt mutatja:
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; } |
A következő példa az új Convert annotációt mutatja be:
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; } |
Ebben az esetben a szabály megjelöli a
Temporal(TemporalType.DATE) annotációt.
@javax.persistence.Temporal(TemporalType.DATE)
private java.sql.Timestamp timestamp;
|
A probléma megoldása érdekében hozzon létre egy általános átalakító segédprogram osztályt, amely felhasználható az átalakítót igénylő összes attribútumhoz:
Converter osztályt, amely átalakít egy
időpecsétet dátummá, ahogy a következő példában látható.
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()); } } |
java.sql.Date attribútum
Temporal(TemporalType.DATE) annotációját egy
Convert annotációra, amelyben a converter
attribútum az új Converter osztályra van beállítva.
A következő példa az eredeti Temporal(TemporalType.DATE)
annotációt mutatja:
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; } |
A következő példa az új Convert annotációt mutatja be:
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; } |
Ebben az esetben a szabály megjelöli a
Temporal(TemporalType.TIME) annotációt.
@javax.persistence.Temporal(TemporalType.TIME)
private java.sql.Timestamp timestamp;
|
A probléma megoldása érdekében hozzon létre egy általános átalakító segédprogram osztályt, amely felhasználható az átalakítót igénylő összes attribútumhoz:
Converter osztályt, amely átalakít egy
időpecsétet időponttá, ahogy a következő példában látható.
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()); } } |
java.sql.Date attribútum
Temporal(TemporalType.TIME) annotációját egy
Convert annotációra, amelyben a converter
attribútum az új Converter osztályra van beállítva.
A következő példa az eredeti Temporal(TemporalType.TIME)
annotációt mutatja:
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; } |
A következő példa az új Convert annotációt mutatja be:
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; } |
A problémával és más OpenJPA - EclipseLink átállítási problémákkal kapcsolatos információkért tekintse meg az OpenJPA - EclipseLink JPA átállítás: Leképezések útmutatót.