@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 지원)
- 패치 및 업데이트 탭을 클릭합니다.
- 위의 패치 번호를 입력하고 검색을 클릭합니다.
- 목록에서 플랫폼에 해당하는 패치 번호 클릭
- 다운로드 버튼을 클릭하여 패치를 다운로드합니다.
- 다운로드하기 전에 해당 메모를 읽은 다음 다운로드 버튼을 클릭합니다.
한 후 를 ojdb7.jar로 바꿉니다.%Oracle_Home%\oracle_common\modules\oracle.jdbc_12.1.0
가추를 합니다.-Doracle.jdbc.DateZeroTime=true
JVM 인수로
언급URL : https://stackoverflow.com/questions/33232260/temporaltemporaltype-date-with-oracle-12
'programing' 카테고리의 다른 글
어떤 테이블이 특정 외래 키 값을 사용하는지 어떻게 알 수 있습니까? (0) | 2023.08.27 |
---|---|
VBA - XMLHTTP 및 WinHttp 요청 속도 (0) | 2023.08.27 |
템플릿 구문 분석 오류: 'mat-icon'은(는) 알려진 요소가 아닙니다. (0) | 2023.08.27 |
php에서 에이잭스를 통해 요청할 때 세션 ID가 변경되는 이유는 무엇입니까? (0) | 2023.08.27 |
HTML 테이블과 함께 정렬 가능한 jQuery UI 사용 (0) | 2023.08.27 |