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) 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:

  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
    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;}
    

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

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:

  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 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 ());
        }}}
    
  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
    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;}
    

@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 ;

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 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 ());
        }}}
    
  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
    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í.