gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:33:02 27 4
gpt4 key购买 nike

我正在为实习创建一个 JPA 2.0 注释合规性工具包。现在,我想知道何时需要 @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 用作 map 的键时,没有默认类型。规范本身(我确实认为随规范交付的 javadoc 是规范的一部分)对 MapKeyTemporal 的使用非常严格。 MapKeyTemporal 声明的 Javadoc:

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

我认为如此严格,他们忘记了您提供的大小写,具有来自 MapKey 引用的属性的类型信息。在 MapKey 的情况下指定类型没有太大意义,因为类型已经在作为映射值的实体中指定。也不允许实体中相应字段的映射键具有不同的时间类型的可能性是不可取的。

如果未指定 MapKeyTemporal 并且没有其他方法可以确定 key 的类型,则 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 - 没有@MapKeyColumn 或@MapKeyTemporal 注释的时态 map 键的默认 TemporalType 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8971643/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com