programing

@Temporal(TemporalType).날짜)(Oracle 12 포함)

newstyles 2023. 8. 27. 08:59

@Temporal(TemporalType).날짜)(Oracle 12 포함)

DB에는 날짜 필드가 있는 여러 개의 엔티티가 있습니다.Oracle은 모든 날짜를 동일한 날짜와 시간 부분으로 간주합니다.그러나 JPA 엔티티는 주석 @Temporal을 통해 구별됩니다.시간 부분을 생략하려면 날짜 필드에 @Temporal(TemporalType)로 주석을 달아야 합니다.DATE)를 사용하면 Oracle이 00:00:00을 저장할 수 있습니다. 그렇지 않으면 주석 없이 그대로 둡니다.

예:

@Entity
public class MyEntity implements Serializable {
  private static final long serialVersionUID = 1L;

  @Id
  private long myentityId;

  @Temporal(TemporalType.DATE)
  private Date importantDate; //01.01.2015 00:00:00

  private Date creationDate; //01.01.2015 10:35:51
  ...
}

...
MyEntity me = new MyEntity();
me.setImportantDate(new Date());
me.setCreationDate(new Date());
...

Oracle 11에서 Oracle 12로 업그레이드하여 importantDate의 시간 부분이 더 이상 누락되지 않습니다!

정확히 같은 프로그램으로 두 데이터베이스에서 광범위하게 테스트했습니다.이것은 실제로 우리의 응용 프로그램을 망칩니다.

이전 동작을 복원하려면 어떻게 해야 합니까?


업데이트 1: 문제를 좁혔습니다. 드라이버 ojdbc6 12.1.0.1.0에 문제가 있으며, ojdbc6 11.2.0.3.0은 의도한 대로 작동합니다.(둘 다 Oracle 12 DB 사용)

이것이 11.1에서 수정된 타임스탬프 문제의 연속입니까? (http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#08_01)


업데이트 2: Hibernate가 문제가 되지 않는 것 같으니 순수 JDBC로 예제를 작성했습니다.

OracleDataSource ods = new OracleDataSource();
...
Connection conn = ods.getConnection();
PreparedStatement ps = conn.prepareStatement("UPDATE MyEntity SET importantDate = ? WHERE myentityId = 4385");
ps.setDate(1, new java.sql.Date(new java.util.Date().getTime()));
ps.execute();
...

이 스니펫은 ojdbc6 11.1과 ojdbc6 12.1 사이를 전환할 때 다르게 작동합니다.

Oracle 지원팀에 문의해 본 결과 다음과 같이 답변했습니다. Oracle 지원 계정이 필요하기 때문에 답변에 대한 링크를 제공할 수 없습니다.

새 동작은 의도한 대로 작동합니다.

JDBC 12.1.0.1에서 getDate 및 setDate는 날짜의 시간 구성 요소를 자르지 않습니다.이 동작은 시간 구성 요소가 잘리는 JDBC 11.2.0.X와는 다릅니다.버그 14389749, 17228297에 따르면 이 변경은 의도적인 것이며 12c 드라이버의 동작이 올바릅니다.

해결 방법은 저에게 다음과 같은 작업을 제공했습니다.

해결 방법 #1: 시간 구성 요소를 삽입하지 않도록 응용 프로그램 수정(예: 정적 UtilMethod)

public static Date truncateTime(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); }

해결 방법 #2: MOS에서 19297927 패치 다운로드 및 적용: (My Oracle 지원)

  1. 패치 및 업데이트 탭을 클릭합니다.
  2. 위의 패치 번호를 입력하고 검색을 클릭합니다.
  3. 목록에서 플랫폼에 해당하는 패치 번호 클릭
  4. 다운로드 버튼을 클릭하여 패치를 다운로드합니다.
  5. 다운로드하기 전에 해당 메모를 읽은 다음 다운로드 버튼을 클릭합니다.

한 후 를 ojdb7.jar로 바꿉니다.%Oracle_Home%\oracle_common\modules\oracle.jdbc_12.1.0 가추를 합니다.-Doracle.jdbc.DateZeroTime=trueJVM 인수로

언급URL : https://stackoverflow.com/questions/33232260/temporaltemporaltype-date-with-oracle-12