Cserélje le a Temporal annotációt egy Converter annotációra bizonyos java.sql attribútumoknál

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:

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

@Temporal(TemporalType.TIMESTAMP) egy java.sql.Date attribútumhoz

Ebben az esetben a szabály megjelöli a Temporal(TemporalType.TIMESTAMP) annotációt.

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

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:

  1. Hozzon létre egy 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());
        }
    }
    
  2. Adja hozzá a Converter osztályt a perzisztencia egység meghatározásához.
  3. Cserélje le a 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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Temporal(TemporalType.TIMESTAMP)
        private 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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=DateTimestampConverter.class)
        private java.sql.Date sqlDateTIMESTAMP;
    }
    

@Temporal(TemporalType.DATE) egy java.sql.Timestamp attribútumhoz

Ebben az esetben a szabály megjelöli a Temporal(TemporalType.DATE) annotációt.

   @javax.persistence.Temporal(TemporalType.DATE)
   private java.sql.Timestamp timestamp;

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:

  1. Hozzon létre egy 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 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. Adja hozzá a Converter osztályt a perzisztencia egység meghatározásához.
  3. Cserélje le a 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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Temporal(TemporalType.DATE)
        private 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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=TimestampDateAnnConverter.class)
        private java.sql.Timestamp sqlTimestampDate;
    }
    

@Temporal(TemporalType.TIME) egy java.sql.Timestamp attribútumhoz

Ebben az esetben a szabály megjelöli a Temporal(TemporalType.TIME) annotációt.

   @javax.persistence.Temporal(TemporalType.TIME)
   private java.sql.Timestamp timestamp;

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:

  1. Hozzon létre egy 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 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. Adja hozzá a Converter osztályt a perzisztencia egység meghatározásához.
  3. Cserélje le a 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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Temporal(TemporalType.TIME)
        private 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
    public class TemporalEntityOJ {
        @Id
        private int id;
        @Convert(converter=TimestampTimeAnnConverter.class)
        private 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.