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) privát java.sql.Date dátum;

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
    nyilvános osztály TemporalEntityHL
        @Id privát int azonosító;
        @Temporal(TemporalType.TIMESTAMP) privát 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
    nyilvános osztály TemporalEntityHL
        @Id privát int azonosító;
        @Convert(converter=DateTimestampConverter.class) privát 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) privát java.sql.Timestamp időpecsét;

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 megvalósítja a AttributeConverter< Timestamp, Date> {
        @Override public Date convertToDatabaseColumn(Timestamp ts) { új Dátum (ts.getTime ());
        }
    
        @Override public Timestamp convertToEntityAttribute(Dátum dátum) { új időpecsétet ad vissza (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
    nyilvános osztály TemporalEntityHL
        @Id privát int azonosító;
        @Temporal(TemporalType.DATE) privát 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
    nyilvános osztály TemporalEntityHL
        @Id privát int azonosító;
        @Convert(converter=TimestampDateAnnConverter.class) privát 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) privát java.sql.Timestamp időpecsét;

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 megvalósítja AttributeConverter< Timestamp, Time> {
        @Override nyilvános idő convertToDatabaseColumn(Timestamp ts) { Új idő visszatérési ideje (ts.getTime ());
        }
    
        @Override public Timestamp convertToEntityAttribute(Időidő) { új időpecsétet ad vissza (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
    nyilvános osztály TemporalEntityHL
        @Id privát int azonosító;
        @Temporal(TemporalType.TIME) privát 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
    nyilvános osztály TemporalEntityHL
        @Id privát int azonosító;
        @Convert(converter=TimestampTimeAnnConverter.class) privát 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.