Zastąp adnotację Temporal adnotacją Converter dla niektórych atrybutów java.sql

Produkt OpenJPA utrwala pola atrybutów typu java.sql.Date, java.sql.Time lub java.sql.Timestamp, które mają adnotację javax.persistence.Temporal, a produkt EclipseLink zgłasza wyjątek.

Dla niektórych kombinacji adnotacji javax.persistence.Temporal i atrybutów java.sql.Date, java.sql.Time oraz java.sql.Timestamp należy dodać kod konwertera, tak aby produkt EclipseLink był kompatybilny z tabelami utworzonymi przez produkt OpenJPA.

Ta reguła skanuje trzy kombinacje adnotacja-atrybut, w których wymagana jest klasa konwertera do transformacji danych między bazą danych a jednostką:

W przypadkach, gdy nie jest wymagana konwersja i adnotacja Temporal może zostać usunięta, patrz reguła Usuń adnotację Temporal dla niektórych atrybutów java.sql .

Adnotacja @Temporal(TemporalType.TIMESTAMP) w atrybucie java.sql.Date

W tym przypadku reguła oznacza flagą adnotację Temporal(TemporalType.TIMESTAMP).

   @javax.persistence.Temporal(TemporalType).TIMESTAMP) prywatna java.sql.Date data;

Aby rozwiązać ten problem, należy utworzyć wspólną klasę programu narzędziowego konwertera, która może być używana dla wszystkich atrybutów potrzebujących tego konwertera:

  1. Utwórz klasę Converter, która przekształca datę w znacznik czasu, jak w poniższym przykładzie.
    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. Dodaj klasę konwertera do definicji jednostki trwałości.
  3. Zastąp adnotację Temporal(TemporalType.TIMESTAMP) w atrybucie java.sql.Date adnotacją Convert z atrybutem converter ustawionym na nową klasę konwertera.

    W poniższym przykładzie przedstawiona została oryginalna adnotacja 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
    klasa publiczna TemporalEntityOJ {
        @Id private int id;
        @Temporal(TemporalType.TIMESTAMP) private java.sql.Date sqlDateTIMESTAMP; }
    

    W poniższym przykładzie przedstawiona została nowa adnotacja 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
    klasa publiczna TemporalEntityOJ {
        @Id private int id;
        @Convert(converter=DateTimestampConverter.class) private java.sql.Date sqlDateTIMESTAMP; }
    

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

W tym przypadku reguła oznacza flagą adnotację Temporal(TemporalType.DATE).

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

Aby rozwiązać ten problem, należy utworzyć wspólną klasę programu narzędziowego konwertera, która może być używana dla wszystkich atrybutów potrzebujących tego konwertera:

  1. Utwórz klasę Converter, która przekształca znacznik czasu w datę, jak w poniższym przykładzie.
    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 data) { return new Timestamp (date.getTime ());
        } }
    
  2. Dodaj klasę konwertera do definicji jednostki trwałości.
  3. Zastąp adnotację Temporal(TemporalType.DATE) w atrybucie java.sql.Timestamp adnotacją Convert z atrybutem converter ustawionym na nową klasę konwertera.

    W poniższym przykładzie przedstawiona została oryginalna adnotacja Temporal(TemporalType.DATE):

    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    klasa publiczna TemporalEntityOJ {
        @Id private int id;
        @Temporal(TemporalType.DATE) private java.sql.Timestamp sqlTimestampDate; }
    

    W poniższym przykładzie przedstawiona została nowa adnotacja 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
    klasa publiczna TemporalEntityOJ {
        @Id private int id;
        @Convert(converter=TimestampDateAnnConverter.class) private java.sql.Timestamp sqlTimestampDate; }
    

Adnotacja @Temporal(TemporalType.TIME) w atrybucie java.sql.Timestamp

W tym przypadku reguła oznacza flagą adnotację Temporal(TemporalType.TIME).

   @javax.persistence.Temporal(TemporalType).TIME) prywatny java.sql.Timestamp znacznik czasu;

Aby rozwiązać ten problem, należy utworzyć wspólną klasę programu narzędziowego konwertera, która może być używana dla wszystkich atrybutów potrzebujących tego konwertera:

  1. Utwórz klasę Converter, która przekształca znacznik czasu w czas, jak w poniższym przykładzie.
    import java.sql.Time;
    import java.sql.Timestamp;
    import javax.persistence.AttributeConverter;
    import javax.persistence.Converter;
    
    @Converter
    klasa publiczna TimestampTimeAnnConverter implementuje AttributeConverter< Timestamp, Time> {
        @Override public Time convertToDatabaseColumn(Timestamp ts) { return new Time (ts.getTime ());
        }
    
        @Override public Timestamp convertToEntityAttribute(Time) { return new Timestamp (time.getTime ());
        } }
    
  2. Dodaj klasę konwertera do definicji jednostki trwałości.
  3. Zastąp adnotację Temporal(TemporalType.TIME) w atrybucie java.sql.Timestamp adnotacją Convert z atrybutem converter ustawionym na nową klasę konwertera.

    W poniższym przykładzie przedstawiona została oryginalna adnotacja Temporal(TemporalType.TIME):

    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    @Entity
    klasa publiczna TemporalEntityOJ {
        @Id private int id;
        @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime; }
    

    W poniższym przykładzie przedstawiona została nowa adnotacja 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
    klasa publiczna TemporalEntityOJ {
        @Id private int id;
        @Convert(converter=TimestampTimeAnnConverter.class) private java.sql.Timestamp sqlTimestampTime; }
    

Informacje na ten temat oraz na temat innych problemów z migracją interfejsu OpenJPA do interfejsu EclipseLink zawiera podręcznik Migracja interfejsu JPA ze środowiska OpenJPA do EclipseLink: Odwzorowania.