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

前端之家收集整理的这篇文章主要介绍了java – 没有@MapKeyColumn或@MapKeyTemporal注释的时态映射键的默认TemporalType是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在为我的实习创建一个JPA 2.0 Annotation compliancy kit.
现在,我想知道何时需要@MapKeyTemporal注释以及何时可选…

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

附加@MapKeyTemporal注释时,列名默认为ATTRIBUTE“_KEY”.

如果不注释@MapKeyColumn和@MapKeyTemporal,则列名默认为ATTRIBUTE“_KEY”,但键的默认值是什么类型?或者你应该得到一个错误

我寻找类似的情况,发现@MapKeyEnumerated.
它是相同的,因为它与@MapKeyColumn相关,它是一个可以映射到多种数据类型的值(@MapKeyTemporal的java.sql.Date/java.sql.Time/java.sql.Timestamp和EnumeratedType.ORDINAL / EnumeratedType.STRING for @MapKeyEnumerated).
我发现了一个区别:
@MapKeyEnumerated有一个默认值.此默认值为EnumeratedType.ORDINAL.

我的问题:
当使用具有基本类型为临时类型的映射键的映射时,映射键转换为持久性的默认TemporalType(根据JPA 2.0)是什么?

解决方法

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

This annotation must be specified for persistent map keys of type Date
and Calendar.

我认为如此严格,他们忘记了你提出的情况,从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)

猜你在找的Java相关文章