Каков TemporalType по умолчанию для временного ключа карты без аннотации @MapKeyColumn или @MapKeyTemporal? - PullRequest
7 голосов
/ 23 января 2012

Я работаю над созданием комплекта соответствия JPA 2.0 для моей стажировки.Прямо сейчас мне интересно, когда аннотация @MapKeyTemporal требуется и когда она необязательна ...

Я знаю, что когда вы определяете столбец ключа карты с помощью @MapKeyColumn, тип ключа должен отображатьсяto может быть получено, посмотрев на тип столбца (и иначе тип в определении столбца).Таким образом, в этом случае аннотация @MapKeyTemporal не требуется.

Когда вы присоединяете аннотацию @MapKeyTemporal, имя столбца по умолчанию имеет значение ATTRIBUTE + "_KEY".

Когда вы этого не делаетеannotate @MapKeyColumn и @MapKeyTemporal, имя столбца по умолчанию равно ATTRIBUTE + "_KEY", но для какого типа ключ используется по умолчанию?Или вы должны получить ошибку?

Я искал похожую ситуацию и нашел @MapKeyEnumerated.Это то же самое, потому что это связано с @MapKeyColumn и это значение, которое может быть сопоставлено нескольким типам данных (java.sql.Date/java.sql.Time/java.sql.Timestamp для @MapKeyTemporal и EnumeratedType.ORDINAL / EnumeratedType.STRING для @MapKeyEnumerated).Я обнаружил одно отличие: @MapKeyEnumerated имеет значение по умолчанию.Это значение по умолчанию EnumeratedType.ORDINAL.

Мой вопрос: При использовании карты с ключом карты, базовый тип которого является временным типом, используется тип TemporalType по умолчанию (в соответствии с JPA 2.0), в который преобразован ключ картыдля настойчивости?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

Ответ, как представляется, заключается в том, что тип по умолчанию отсутствует, когда в качестве ключа карты используется java.util.Date или java.util.Calendar. Сама спецификация (я считаю, что javadocs поставляются со спецификацией как часть спецификации) очень строга к использованию MapKeyTemporal. Javadoc для утверждений MapKeyTemporal:

Эта аннотация должна быть указана для постоянных ключей карты типа Дата и календарь.

Я думаю, с такой строгостью они забыли случай, который вы представляете, имея информацию о типе из атрибута, на который ссылается MapKey. Не имеет особого смысла указывать тип в случае 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 голосов
/ 06 февраля 2012

По сути, вы не спрашиваете, существует ли тип по умолчанию для MapKeyTemporal, но если реализации JPA 2.0 или спецификации используют значение по умолчанию для временных типов.

Что подразумевает, что есть более важный типв базе данных между датой и отметкой времени, это, вероятно, не так.

Также, если у вас есть календарь, реализация, вероятно, вызывает getTime (), а затем создает новый тип Sql, как он решаетреализация?

Напоминание: первая причина существования временного просто потому, что ключ с классом java.util.Date может быть одним из трех типов времени в Java (Time, Timestamp и sql.Date.), хотя это не имеет значения в Java, это имеет значение в базе данных, где это различные типы.

Если я не укажу временный тип, ничто не помешает мне иметь разные типы sql для одного и того же объекта, ломаясь во время выполнения.

...