2012-01-23 1 views
7

인턴쉽을 위해 JPA 2.0 Annotation Compliance Kit를 만드는 중입니다. 지금 당장 @MapKeyTemporal 주석이 필요한시기와 선택 사항 일 때 궁금합니다 ...@MapKeyColumn 또는 @MapKeyTemporal 주석이없는 임시 맵 키의 기본 TemporalType은 무엇입니까?

@MapKeyColumn을 사용하여 맵 키의 열을 정의 할 때 키를 매핑해야하는 유형을 알고 있습니다. 는 열의 유형 (그리고 열 정의의 유형)을보고 파생 될 수 있습니다. 따라서이 경우에는 @MapKeyTemporal 주석이 필요하지 않습니다.

@MapKeyTemporal 주석을 첨부하면 열 이름의 기본값은 ATTRIBUTE + "_KEY"입니다.

@MapKeyColumn 및 @MapKeyTemporal에 주석을 추가하지 않으면 열 이름의 기본값은 ATTRIBUTE + "_KEY"이지만 키 기본값은 어떤 유형입니까? 또는 오류가 발생 했습니까?

비슷한 상황을 찾아서 @MapKeyEnumerated를 찾았습니다. @MapKeyColumn과 관련되어 있고 여러 데이터 유형 (@MapKeyTemporal의 경우 java.sql.Date/java.sql.Time/java.sql.Timestamp, @MapKeyEnumerated의 경우 EnumeratedType.ORDINAL/EnumeratedType.STRING)에 매핑 할 수있는 값이기 때문에 동일합니다. 하나의 차이점을 발견했습니다 : @MapKeyEnumerated에 기본값이 있습니다. 기본값은 EnumeratedType.ORDINAL입니다.

내 질문 : 기본 유형이 임시 유형 인지도 키를 사용하는 경우 지속성을 위해지도 키가 변환되는 기본 TemporalType (JPA 2.0에 따라)은 무엇입니까?

+0

현상금에 대한 궁금증은 있지만 답변을 얻을 지 확신 할 수 없습니다. 누군가가 내 질문을 개선하는 방법을 알려줌으로써 (아마도 50의 현상금으로) 답변을 얻을 수 있을까요? – Pimgd

답변

3

java.util.Date 또는 java.util.Calendar가 맵의 키로 사용되는 경우 기본 유형이없는 것 같습니다. 사양 자체 (사양의 일부로 사양과 함께 제공되는 javadocs를 고려해야 함)는 MapKeyTemporal의 사용에 대해 매우 엄격합니다. MapKeyTemporal에 대한 Javadoc 클레임 :

이 주석은 날짜 및 달력 유형의 영구 맵 키에 지정해야합니다.

MapKey에서 참조하는 속성의 유형 정보가있는 것을 잊어 버렸습니다. type이 이미지도의 값인 엔티티에 지정 되었기 때문에 MapKey의 경우 유형을 지정하는 것이 너무 의미가 없습니다. 또한 엔티티의 해당 필드에 대한 맵의 키에 대해 다른 시간 유형을 가질 수있는 가능성은 바람직하지 않습니다.

MapKeyTemporal가 지정되지 않고 키의 유형을 파악하기 위해 다른 방법이없는 경우는 EclipseLink (참조 구현은, 항상 사양 다음은 아니지만 것은) 다음과 같은 예외 생성하는 경우 기본적으로

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The attribute [map] from the entity class [class X] 
does not specify a temporal type. A temporal type must be specified for persistent 
fields or properties of type java.util.Date and java.util.Calendar. 
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) 
+0

이것은 @MapKeyTemporal이 항상 필요하다는 것을 의미합니까, 아니면 다른 주석에서 파생 될 수없는 경우에만 의미합니까? – Pimgd

+0

문서화가 필요 이상으로 엄격하기 때문에 결론을 내리기가 어렵습니다. 참조 구현은 "유도 할 수없는 경우에만"- 접근을 취합니다. 필자가 생각하기에 "항상"보다는 의미가 있습니다. 왜냐하면 대상 엔티티의 속성에 대해 지정된 MapKeyTemporal 및 TemporalType 값 사이의 충돌에 문제가 없기 때문입니다. –

0

을, MapKeyTemporal에 기본 유형이 있는지 묻지 않고 JPA 2.0 또는 스펙의 구현이 임시 유형에 기본값을 사용하는지 묻습니다.

이는 날짜와 시간 소인 사이에 데이터베이스에 더 중요한 유형이 있음을 의미합니다. 이는 그렇지 않습니다.

또한 캘린더가있는 경우 구현에서 getTime()을 호출 한 다음 거기에서 새로운 Sql 유형을 생성합니다. 구현 방법은 어떻게 결정됩니까?

알림 : 시간적 존재의 첫 번째 이유는 단순히 java.util.Date 클래스의 키가 Java (Time, Timestamp 및 sql.Date)의 세 가지 시간 유형 중 하나 일 수 있기 때문입니다. Java에서는 중요하지 않지만, 이들이 구별 유형 인 데이터베이스에서 수행됩니다.

임시 형식을 지정하지 않으면 런타임시 깨는 동일한 엔터티에 대해 다른 SQL 형식을 갖지 못합니다.

+0

귀하의 답변은 "기본 공급자/공급 업체별"로 번역 될 것입니다. 나는 특정 구현의 일을 찾는 방법을 찾고 있지 않다. JPA의 표준을 찾고 있는데, 사용할 수없는 경우 가장 일반적으로 구현 된 기본값입니다. – Pimgd

+0

아니, 네가 나를 이해했다고 생각하지 않는다. 구현시 기본 시간 유형이 없다는 것을 정당화했습니다. – Gepsens

관련 문제