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

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

일부 javax.persistence.Temporal 어노테이션과 java.sql.Date, java.sql.Timejava.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로 마이그레이션: 맵핑 안내서를 참조하십시오.