Nahradit anotaci Temporal za anotaci Converter pro některé atributy java.sql

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:

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.

@Temporal(TemporalType.TIMESTAMP) v atributu java.sql.Date

V tomto případě pravidlo značí anotaci Temporal(TemporalType.TIMESTAMP).

   @javax.persistence.Temporal(TemporalType.TIMESTAMP)
   private java.sql.Date date;

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:

  1. Vytvořte třídu 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());
        }
    }
    
  2. Přidejte třídu převodníku do definice jednotky perzistence.
  3. Nahraďte anotaci 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
    public class TemporalEntityOJ {
        @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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=DateTimestampConverter.class)
        private java.sql.Date sqlDateTIMESTAMP;
    }
    

@Temporal(TemporalType.DATE) on a java.sql.Timestamp attribute

V tomto případě pravidlo značí anotaci Temporal(TemporalType.DATE).

   @javax.persistence.Temporal(TemporalType.DATE)
   private java.sql.Timestamp 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:

  1. Vytvořte třídu 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 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());
        }
    }
    
  2. Přidejte třídu převodníku do definice jednotky perzistence.
  3. Nahraďte anotaci 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
    public class TemporalEntityOJ {
        @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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=TimestampDateAnnConverter.class)
        private java.sql.Timestamp sqlTimestampDate;
    }
    

@Temporal(TemporalType.TIME) v atributu java.sql.Timestamp

V tomto případě pravidlo značí anotaci Temporal(TemporalType.TIME).

   @javax.persistence.Temporal(TemporalType.TIME)
   private java.sql.Timestamp 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:

  1. Vytvořte třídu 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 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());
        }
    }
    
  2. Přidejte třídu převodníku do definice jednotky perzistence.
  3. Nahraďte anotaci 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
    public class TemporalEntityOJ {
        @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
    public class TemporalEntityOJ {
        @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í.