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) privát java.sql.Date dátum;
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 nyilvános osztály TemporalEntityHL @Id privát int azonosító; @Temporal(TemporalType.TIMESTAMP) privát 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 nyilvános osztály TemporalEntityHL @Id privát int azonosító; @Convert(converter=DateTimestampConverter.class) privát java.sql.Date sqlDateTIMESTAMP;}
Ebben az esetben a szabály megjelöli a
Temporal(TemporalType.DATE) annotációt.
@javax.persistence.Temporal(TemporalType.DATE) privát java.sql.Timestamp időpecsét;
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 megvalósítja a AttributeConverter< Timestamp, Date> { @Override public Date convertToDatabaseColumn(Timestamp ts) { új Dátum (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Dátum dátum) { új időpecsétet ad vissza (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 nyilvános osztály TemporalEntityHL @Id privát int azonosító; @Temporal(TemporalType.DATE) privát 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 nyilvános osztály TemporalEntityHL @Id privát int azonosító; @Convert(converter=TimestampDateAnnConverter.class) privát java.sql.Timestamp sqlTimestampDate;}
Ebben az esetben a szabály megjelöli a
Temporal(TemporalType.TIME) annotációt.
@javax.persistence.Temporal(TemporalType.TIME) privát java.sql.Timestamp időpecsét;
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 megvalósítja AttributeConverter< Timestamp, Time> { @Override nyilvános idő convertToDatabaseColumn(Timestamp ts) { Új idő visszatérési ideje (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Időidő) { új időpecsétet ad vissza (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 nyilvános osztály TemporalEntityHL @Id privát int azonosító; @Temporal(TemporalType.TIME) privát 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 nyilvános osztály TemporalEntityHL @Id privát int azonosító; @Convert(converter=TimestampTimeAnnConverter.class) privát 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.