我正在为我的实习创建一个 JPA 2.0 Annotation 合规工具包。
现在,我想知道什么时候需要 @MapKeyTemporal 注释,什么时候它是可选的......
我知道,当您使用 @MapKeyColumn 定义映射键的列时,可以通过查看列的类型(以及列定义中的类型)来派生键应映射到的类型。因此,在这种情况下,不需要 @MapKeyTemporal 注释。
当您附加@MapKeyTemporal注释时,列名称默认为ATTRIBUTE +“_KEY”。
当不注解@MapKeyColumn和@MapKeyTemporal时,列名默认为ATTRIBUTE + "_KEY",但是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)是什么?
答案似乎是,当 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)