OpenJPA では、javax.persistence.Temporal アノテーションを持つ java.sql.Date 型、java.sql.Time 型、または java.sql.Timestamp 型の属性のフィールドは永続化されるのに対し、EclipseLink では例外がスローされます。
javax.persistence.Temporal アノテーションと java.sql.Date、java.sql.Time、および java.sql.Timestamp の各属性の一部の組み合わせでは、EclipseLink が OpenJPA で作成されたテーブルとの互換性を持つように、コンバーター・コードを追加する必要があります。
この規則は、データベースとエンティティー間でデータを変換するためにコンバーター・クラスが必要となる、アノテーションと属性の 3 つの組み合わせをスキャンします。
java.sql.Date 属性上の javax.persistence.Temporal(TemporalType.TIMESTAMP) アノテーションjava.sql.Timestamp 属性上の javax.persistence.Temporal(TemporalType.DATE) アノテーションjava.sql.Timestamp 属性上の javax.persistence.Temporal(TemporalType.TIME) アノテーション
変換が不要で Temporal アノテーションを削除できる場合については、
一部の java.sql 属性の Temporal アノテーションを削除する規則を参照してください。
このケースでは、規則は Temporal(TemporalType.TIMESTAMP) アノテーションにフラグを立てます。
@javax.persistence.Temporal(TemporalType。TIMESTAMP) private java.sql.Date date;
この問題を解決するには、このコンバーターを必要とするすべての属性に使用できる共通コンバーター・ユーティリティー・クラスを作成します。
Converter クラスを作成します。
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 属性上の Temporal(TemporalType.TIMESTAMP) アノテーションを、新しいコンバーター・クラスに設定された converter 属性を持つ Convert アノテーションに置き換えます。
以下の例は、変更前の Temporal(TemporalType.TIMESTAMP) アノテーションを示します。
インポート javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity 公開クラス TemporalEntityOJ { @Id private int ID; @Temporal(TemporalType.TIMESTAMP) private java.sql.Date sqlDateTIMESTAMP;}
以下の例は、新しい Convert アノテーションを示します。
インポート javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity 公開クラス TemporalEntityOJ { @Id private int ID; @Convert(converter=DateTimestampConverter.class) private java.sql.Date sqlDateTIMESTAMP;}
このケースでは、規則は Temporal(TemporalType.DATE) アノテーションにフラグを立てます。
@javax.persistence.Temporal(TemporalType。DATE) private java.sql.Timestamp タイム・スタンプ;
この問題を解決するには、このコンバーターを必要とするすべての属性に使用できる共通コンバーター・ユーティリティー・クラスを作成します。
Converter クラスを作成します。
import java.sql.Date; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter 公開クラス TimestampDateAnnConverter は AttributeConverter< Timestamp, Date> {を実装します @Override public Date convertToDatabaseColumn(Timestamp ts) { return new Date (ts.getTime ()); } 年 @Override public Timestamp convertToEntityAttribute(日付) { return new Timestamp (date.getTime ()); }} (})
java.sql.Timestamp 属性上の Temporal(TemporalType.DATE) アノテーションを、新しいコンバーター・クラスに設定された converter 属性を持つ Convert アノテーションに置き換えます。
以下の例は、変更前の Temporal(TemporalType.DATE) アノテーションを示します。
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity 公開クラス TemporalEntityOJ { @Id private int ID; @Temporal(TemporalType.DATE) private java.sql.Timestamp sqlTimestampDate;}
以下の例は、新しい Convert アノテーションを示します。
インポート javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity 公開クラス TemporalEntityOJ { @Id private int ID; @Convert(converter=TimestampDateAnnConverter.class) private java.sql.Timestamp sqlTimestampDate;}
このケースでは、規則は Temporal(TemporalType.TIME) アノテーションにフラグを立てます。
@javax.persistence.Temporal(TemporalType。TIME) private java.sql.Timestamp タイム・スタンプ;
この問題を解決するには、このコンバーターを必要とするすべての属性に使用できる共通コンバーター・ユーティリティー・クラスを作成します。
Converter クラスを作成します。
import java.sql.Time; import java.sql.Timestamp; import javax.persistence.AttributeConverter; import javax.persistence.Converter; @Converter 公開クラス 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.Timestamp 属性上の Temporal(TemporalType.TIME) アノテーションを、新しいコンバーター・クラスに設定された converter 属性を持つ Convert アノテーションに置き換えます。
以下の例は、変更前の Temporal(TemporalType.TIME) アノテーションを示します。
import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity 公開クラス TemporalEntityOJ { @Id private int ID; @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime;}
以下の例は、新しい Convert アノテーションを示します。
インポート javax.persistence.Convert; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; @Entity 公開クラス TemporalEntityOJ { @Id private int ID; @Convert(converter=TimestampTimeAnnConverter.class) private java.sql.Timestamp sqlTimestampTime;}
この問題や、OpenJPA から EclipseLink へのマイグレーションに関するその他の問題については、 OpenJPA to EclipseLink JPA Migration: Mappings ガイドを参照してください。