일부 java.sql 속성에 대해 임시 어노테이션을 변환기 어노테이션으로 대체

OpenJPA에서는 javax.persistence.Temporal 어노테이션이 있는 java.sql.Date, java.sql.Time 또는 java.sql.Timestamp 유형의 속성 필드를 지속하지만 EclipseLink에서는 예외 처리합니다.

일부 javax.persistence.Temporal 어노테이션과 java.sql.Date, java.sql.Time 및 java.sql.Timestamp 속성 조합의 경우 변환기 코드를 추가하여 EclipseLink가 OpenJPA에서 작성한 테이블과 호환 가능하도록 해야 합니다.

이 규칙은 데이터베이스 및 엔티티 간에 데이터를 변환하는 데 변환기 클래스가 필요한 세 가지 어노테이션-속성 조합에 대해 스캔합니다.

변환이 필요하지 않고 Temporal 어노테이션을 제거할 수 있는 경우는 일부 java.sql 속성에 대해 임시 어노테이션 제거 규칙을 참조하십시오.

java.sql.Date 속성의 @Temporal(TemporalType.TIMESTAMP)

이 경우 규칙은 Temporal(TemporalType.TIMESTAMP) 어노테이션에 플래그를 지정합니다.

   @javax.persistence.Temporal(TemporalType.TIMESTAMP) 개인용 java.sql.Date 날짜;

이 문제를 해결하려면 이 변환기가 필요한 모든 속성에 대해 사용할 수 있는 공통 변환기 유틸리티 클래스를 작성하십시오.

  1. 다음 예제와 같이 날짜를 시간소인으로 변환하는 Converter 클래스를 작성하십시오.
    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. 지속성 단위 정의에 변환기 클래스를 추가하십시오.
  3. java.sql.Date 속성의 Temporal(TemporalType.TIMESTAMP) 어노테이션을 converter 속성이 새 변환기 클래스로 설정된 Convert 어노테이션으로 대체하십시오.

    다음 예제는 원래 Temporal(TemporalType.TIMESTAMP) 어노테이션을 표시합니다.

    가져오기 javax.persistence.Convert;
    가져오기 javax.persistence.Entity;
    가져오기 javax.persistence.Id;
    가져오기 javax.persistence.Table;
    가져오기 javax.persistence.Temporal;
    가져오기 javax.persistence.TemporalType;
    
    @Entity
    공용 클래스 TemporalEntityOJ {
        @Id private int ID
        @Temporal(TemporalType.TIMESTAMP) 개인용 java.sql.Date sqlDateTIMESTAMP;}
    

    다음 예제는 새 Convert 어노테이션을 표시합니다.

    가져오기 javax.persistence.Convert;
    가져오기 javax.persistence.Entity;
    가져오기 javax.persistence.Id;
    가져오기 javax.persistence.Table;
    가져오기 javax.persistence.Temporal;
    가져오기 javax.persistence.TemporalType;
    
    @Entity
    공용 클래스 TemporalEntityOJ {
        @Id private int ID
        @Convert(converter=DateTimestampConverter.class) 개인용 java.sql.Date sqlDateTIMESTAMP;}
    

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

이 경우 규칙은 Temporal(TemporalType.DATE) 어노테이션에 플래그를 지정합니다.

   @javax.persistence.Temporal(TemporalType.DATE) 개인용 java.sql.Timestamp 시간소인;

이 문제를 해결하려면 이 변환기가 필요한 모든 속성에 대해 사용할 수 있는 공통 변환기 유틸리티 클래스를 작성하십시오.

  1. 다음 예제와 같이 시간소인을 날짜로 변환하는 Converter 클래스를 작성하십시오.
    임포트 java.sql.Date;
    임포트 java.sql.Timestamp;
    가져오기 javax.persistence.AttributeConverter;
    가져오기 javax.persistence.Converter;
    
    @Converter
    공용 클래스 TimestampDateAnnConverter 는 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. 지속성 단위 정의에 변환기 클래스를 추가하십시오.
  3. java.sql.Timestamp 속성의 Temporal(TemporalType.DATE) 어노테이션을 converter 속성이 새 변환기 클래스로 설정된 Convert 어노테이션으로 대체하십시오.

    다음 예제는 원래 Temporal(TemporalType.DATE) 어노테이션을 표시합니다.

    가져오기 javax.persistence.Entity;
    가져오기 javax.persistence.Id;
    가져오기 javax.persistence.Temporal;
    가져오기 javax.persistence.TemporalType;
    
    @Entity
    공용 클래스 TemporalEntityOJ {
        @Id private int ID
        @Temporal(TemporalType.DATE) private java.sql.Timestamp sqlTimestampDate;}
    

    다음 예제는 새 Convert 어노테이션을 표시합니다.

    가져오기 javax.persistence.Convert;
    가져오기 javax.persistence.Entity;
    가져오기 javax.persistence.Id;
    가져오기 javax.persistence.Table;
    가져오기 javax.persistence.Temporal;
    가져오기 javax.persistence.TemporalType;
    
    @Entity
    공용 클래스 TemporalEntityOJ {
        @Id private int ID
        @Convert(converter=TimestampDateAnnConverter.class) 개인용 java.sql.Timestamp sqlTimestampDate;}
    

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

이 경우 규칙은 Temporal(TemporalType.TIME) 어노테이션에 플래그를 지정합니다.

   @javax.persistence.Temporal(TemporalType.TIME) private java.sql.Timestamp 시간소인;

이 문제를 해결하려면 이 변환기가 필요한 모든 속성에 대해 사용할 수 있는 공통 변환기 유틸리티 클래스를 작성하십시오.

  1. 다음 예제와 같이 시간소인을 시간으로 변환하는 Converter 클래스를 작성하십시오.
    임포트 java.sql.Time;
    임포트 java.sql.Timestamp;
    가져오기 javax.persistence.AttributeConverter;
    가져오기 javax.persistence.Converter;
    
    @Converter
    공용 클래스 TimestampTimeAnnConverter 는 AttributeConverter< Timestamp, Time> {을 구현합니다.
        @Override public Time convertToDatabaseColumn(Timestamp ts) { return new Time (ts.getTime ());
        }
    
        @Override public Timestamp convertToEntityAttribute(Time time) { 새 Timestamp (time.getTime ());
        }}
    
  2. 지속성 단위 정의에 변환기 클래스를 추가하십시오.
  3. java.sql.Timestamp 속성의 Temporal(TemporalType.TIME) 어노테이션을 converter 속성이 새 변환기 클래스로 설정된 Convert 어노테이션으로 대체하십시오.

    다음 예제는 원래 Temporal(TemporalType.TIME) 어노테이션을 표시합니다.

    가져오기 javax.persistence.Entity;
    가져오기 javax.persistence.Id;
    가져오기 javax.persistence.Temporal;
    가져오기 javax.persistence.TemporalType;
    
    @Entity
    공용 클래스 TemporalEntityOJ {
        @Id private int ID
        @Temporal(TemporalType.TIME) private java.sql.Timestamp sqlTimestampTime;}
    

    다음 예제는 새 Convert 어노테이션을 표시합니다.

    가져오기 javax.persistence.Convert;
    가져오기 javax.persistence.Entity;
    가져오기 javax.persistence.Id;
    가져오기 javax.persistence.Table;
    가져오기 javax.persistence.Temporal;
    가져오기 javax.persistence.TemporalType;
    
    @Entity
    공용 클래스 TemporalEntityOJ {
        @Id private int ID
        @Convert(converter=TimestampTimeAnnConverter.class) 개인용 java.sql.Timestamp sqlTimestampTime;}
    

이 문제 및 기타 OpenJPA에서 EclipseLink로의 마이그레이션 문제에 대한 정보는 OpenJPA에서 EclipseLink JPA로 마이그레이션: 맵핑 안내서를 참조하십시오.