Rozhraní OpenJPA trvale uchovává pole atributů typu java.sql.Date, java.sql.Time nebo java.sql.Timestamp, které mají anotaci javax.persistence.Temk, zatímco EclipseLink generuje výjimku.
Pro některé kombinace anotací javax.persistence.Temporal a atributů java.sql.Date, java.sql.Time a java.sql.Timestamp musíte přidat kód převodníku tak, aby EclipseLink byl kompatibilní s tabulkami vytvořenými OpenJPA.
Toto pravidlo prochází a hledá tři kombinace anotace-atribut, kde je zapotřebí třída převodníku k transformaci dat mezi databází a entitou:
javax.persistence.Temporal(TemporalType.TIMESTAMP) v atributu java.sql.Datejavax.persistence.Temporal(TemporalType.DATE) v atributu java.sql.Timestampjavax.persistence.Temporal(TemporalType.TIME) v atributu java.sql.Timestamp
V případech, kdy není zapotřebí žádná konverze a anotaci Temporal lze odebrat, naleznete informace v pravidle
Remove Temporal annotation for some java.sql attributes.
V tomto případě pravidlo značí anotaci Temporal(TemporalType.TIMESTAMP).
@javax.persistence.Temporal(TemporalType.TIMESTAMP) soukromé java.sql.Date datum;
Chcete-li vyřešit tento problém, vytvořte společnou třídu obslužného programu převodníku, kterou lze použít pro všechny atributy vyžadující tento převodník:
Converter, která převádí datum na časové razítko, jako např. následující příklad.
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) v atributu java.sql.Date za anotaci Convert, která má atribut converter nastavený na novou třídu převodníku.
Následující příklad zobrazuje původní anotaci 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 veřejná třída TemporalEntityÚř. věst. { @Id private int id; @Temporal(TemporalType.TIMESTAMP) private java.sql.Date sqlDateTIMESTAMP;}
Následující příklad zobrazuje novou anotaci 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 veřejná třída TemporalEntityÚř. věst. { @Id private int id; @Convert(converter=DateTimestampConverter.class) private java.sql.Date sqlDateTIMESTAMP;}
V tomto případě pravidlo značí anotaci Temporal(TemporalType.DATE).
@javax.persistence.Temporal(TemporalType.DATE) soukromé java.sql.Timestamp ;
Chcete-li vyřešit tento problém, vytvořte společnou třídu obslužného programu převodníku, kterou lze použít pro všechny atributy vyžadující tento převodník:
Converter, která převádí časové razítko na datum, jako např. následující příklad.
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 date) { vrací nové Timestamp (date.getTime ()); }}}
Temporal(TemporalType.DATE) v atributu java.sql.Timestamp za anotaci Convert, která má atribut converter nastavený na novou třídu převodníku.
Následující příklad zobrazuje původní anotaci Temporal(TemporalType.DATE):
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity veřejná třída TemporalEntityÚř. věst. { @Id private int id; @Temporal(TemporalType.DATE) private java.sql.Timestamp sqlTimestampDate;}
Následující příklad zobrazuje novou anotaci 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 veřejná třída TemporalEntityÚř. věst. { @Id private int id; @Convert(converter=TimestampDateAnnConverter.class) private java.sql.Timestamp sqlTimestampDate;}
V tomto případě pravidlo značí anotaci Temporal(TemporalType.TIME).
@javax.persistence.Temporal(TemporalType.TIME) private java.sql.Timestamp ;
Chcete-li vyřešit tento problém, vytvořte společnou třídu obslužného programu převodníku, kterou lze použít pro všechny atributy vyžadující tento převodník:
Converter, která převádí časové razítko na čas, jako např. následující příklad.
import java.sql.Time; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter public class TimestampTimeAnnConverter implementuje AttributeConverter< Timestamp, Time> { @Override public Time convertToDatabaseColumn(Timestamp ts) { return new Time (ts.getTime ()); } @Override public Timestamp convertToEntityAttribute(Time) { vrací nové Timestamp (time.getTime ()); }}}
Temporal(TemporalType.TIME) v atributu java.sql.Timestamp za anotaci Convert, která má atribut converter nastavený na novou třídu převodníku.
Následující příklad zobrazuje původní anotaci Temporal(TemporalType.TIME):
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity veřejná třída TemporalEntityÚř. věst. { @Id private int id; @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime;}
Následující příklad zobrazuje novou anotaci 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 veřejná třída TemporalEntityÚř. věst. { @Id private int id; @Convert(converter=TimestampTimeAnnConverter.class) private java.sql.Timestamp sqlTimestampTime;}
Informace o tomto problému a jiných problémech migrace OpenJPA na EclipseLink viz příručka Migrace OpenJPA na EclipseLink JPA: Mapování.