没有@MapKeyColumn或@MapKeyTemporal注释的时态映射键的默认TemporalType是什么?

Pim*_*mgd 7 java annotations jpa-2.0

我正在为我的实习创建一个JPA 2.0 Annotation compliancy kit.现在,我想知道何时需要@MapKeyTemporal注释以及什么时候它是可选的...

我知道当您使用@MapKeyColumn定义映射键的列时,可以通过查看列的类型(以及columndefinition中的类型)来派生应映射到键的类型.因此,在这种情况下,不需要@MapKeyTemporal注释.

附加@MapKeyTemporal注释时,列名默认为ATTRIBUTE +"_ KEY".

如果不注释@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)是什么?

Mik*_*unu 3

答案似乎是,当 java.util.Date 或 java.util.Calendar 用作地图的键时,没有默认类型。规范本身(我确实认为随规范一起提供的 javadocs 作为规范的一部分)对于 MapKeyTemporal 的使用非常严格。MapKeyTemporal 声明的 Javadoc:

必须为日期和日历类型的持久映射键指定此注释。

我认为,如此严格,他们忘记了您提供的情况,具有来自 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)
Run Code Online (Sandbox Code Playgroud)