Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';没有@MapKeyColumn或@MapKeyTemporal注释的时态映射键的默认时态类型是什么?_Java_Annotations_Jpa 2.0 - Fatal编程技术网

Java 什么';没有@MapKeyColumn或@MapKeyTemporal注释的时态映射键的默认时态类型是什么?

Java 什么';没有@MapKeyColumn或@MapKeyTemporal注释的时态映射键的默认时态类型是什么?,java,annotations,jpa-2.0,Java,Annotations,Jpa 2.0,我正在为我的实习工作创建一个JPA2.0注释合规工具包。 现在,我想知道什么时候需要@MapKeyTemporal注释,什么时候是可选的 我知道,当您使用@MapKeyColumn定义映射键的列时,可以通过查看列的类型(或者列定义中的类型)来派生键应该映射到的类型。因此,在这种情况下,不需要@MapKeyTemporal注释 附加@MapKeyTemporal注释时,列名默认为属性+“\u KEY” 如果不注释@MapKeyColumn和@MapKeyTemporal,列名默认为属性+“\u K

我正在为我的实习工作创建一个JPA2.0注释合规工具包。 现在,我想知道什么时候需要@MapKeyTemporal注释,什么时候是可选的

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

附加@MapKeyTemporal注释时,列名默认为属性+“\u KEY”

如果不注释@MapKeyColumn和@MapKeyTemporal,列名默认为属性+“\u KEY”,但键默认为什么类型?或者你应该得到一个错误

我寻找类似的情况,发现@MapKeyEnumerated。 这是一样的,因为它与@MapKeyColumn相关,并且它是一个可以映射到多个数据类型的值(
java.sql.Date/java.sql.Time/java.sql.Timestamp
,对于@MapKeyTemporal,它是
EnumeratedType.ORDINAL
/
EnumeratedType.STRING
,对于@MapKeyEnumerated)。 我发现了一个不同点: @MapKeyEnumerated具有默认值。此默认值为
EnumeratedType.ORDINAL

我的问题:
当使用一个映射键的基本类型是时态类型的映射时,映射键被转换为什么样的默认时态类型(根据JPA 2.0)进行持久化?

答案似乎是,当java.util.Date或java.util.Calendar用作映射键时,没有默认类型。规范本身(我确实认为JavaDoc以规范作为规范的一部分交付)对MpKimTimes的使用非常严格。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)

基本上,您并不是询问MapKeyTemporal是否有默认类型,而是询问JPA2.0或规范的实现是否使用默认值作为时间类型

这意味着数据库中日期和时间戳之间有一个更重要的类型,但情况可能并非如此

另外,如果您有一个日历,那么实现可能会调用getTime(),然后从中构造一个新的Sql类型,它如何决定实现

提醒: 存在temporal的第一个原因很简单,因为类为java.util.Date的键可以是java中的三种时间类型(time、Timestamp和sql.Date)中的任意一种,而这在java中并不重要,但在数据库中它们是不同的类型


如果我不指定时态类型,没有什么能阻止我为同一个实体使用不同的sql类型,在运行时中断。

我想知道是否对这一点给予奖励,但我甚至不确定是否能得到答案。有人能告诉我如何改进我的问题,这样我就能够得到答案(可能有50个悬赏)?这是否意味着总是需要@MapKeyTemporal,或者只有在不可能从其他注释派生时才需要@MapKeyTemporal?很难下结论,因为文档比需要的更严格。参考实现采用“仅在不可能派生时”的方法。对我来说,这比“始终”更有意义,因为在目标实体中为属性指定的MapKeyTemporal值和TemporalType值之间没有冲突的问题。您的答案将被翻译为“默认值是特定于提供商/供应商的”。我不是在寻找一种具体的实现方式;我正在寻找JPA的标准,如果不可用,最常用的默认实现。不,我认为你不理解我。我的理由是,在任何实现中都没有默认的时间类型。