org.hibernate.AnnotationException:@Temporal只应在java.util.Date或java.util.Calendar属性上设置

时间:2012-07-11 12:27:04

标签: jpa-2.0


hibernate-entitymanager-3.4.0.GA.jar

hibernate-annotations-3.4.0.GA.jar

hibernate-commons-annotations-3.3.0.ga.jar

hibernate-core-3.3.1.GA.jar

javax.persistence.jar

am using above jars to run jpa program but am getting below exception.



org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or 

java.util.Calendar property: asso_attrib_overrides.FulltimeEmployee.currentProjects.


@Entity
public class FulltimeEmployee extends Employee {

    @ElementCollection

    @CollectionTable(name="EMP_PROJECTS", joinColumns=@JoinColumn(name="MY_EMP_ID"))

    @Temporal(TemporalType.DATE)

    @MapKeyJoinColumn(name="THE_PROJECT_ID")

    @Column(name="STARTDATE")


    protected Map<Project, Date> currentProjects;

    public Map<Project, Date> getCurrentProjects() {

        return currentProjects;
    }

      public void setCurrentProjects(Map<Project, Date> currentProjects) {

        this.currentProjects = currentProjects;
    }


5 个答案:

答案 0 :(得分:4)

我得到了同样的错误,事实证明我正在做

import java.sql.Date;

而不是

import java.util.Date;

希望这可能会有所帮助

答案 1 :(得分:0)

根据标记,您使用的是JPA 2.0。这不完全正确,因为3.4是JPA 1.0实现。只有3.5.x的Hibernate版本才是JPA 2.0 API的实现。

这会导致问题,因为在JPA 2.0中引入了使用@Temporal和ElementCollection的概念。此错误不会被忽略,因为早期版本中已存在@Temporal注释,但JPA 2.0中的使用范围已扩大以涵盖您的用例。仅在以后的规范中存在的其他注释会被忽略,这也可能会导致问题。

您可以做的是将Hibernate更新到更新的版本,例如3.6.10。如果您正在创建新软件,则不存在迁移问题,因此直接更新到4.x是有意义的。

答案 2 :(得分:0)

使用Date时,返回类型必须为Date。即java.util(import java.util.Date;)

   private Date date;

@Temporal(TemporalType.DATE)
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

答案 3 :(得分:0)

我遇到了同样的问题,并且在运行该应用程序时得到关注。

Exception in thread "main" org.hibernate.AnnotationException: @Temporal should only be set on a java.util.Date or java.util.Calendar property: com.model.Student.currentDate
    at org.hibernate.cfg.annotations.SimpleValueBinder.setType(SimpleValueBinder.java:189)
    at org.hibernate.cfg.annotations.PropertyBinder.makePropertyAndValue(PropertyBinder.java:185)
    at org.hibernate.cfg.annotations.PropertyBinder.makePropertyValueAndBind(PropertyBinder.java:205)
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:2236)
    at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:961)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:788)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:250)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:231)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:274)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:84)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:474)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at com.main.HibernateMain.main(HibernateMain.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

发生这种情况是因为我将错误的Date导入语句导入了我的班级

import java.sql.Date;

删除import语句并使用以下

import java.util.Date;

然后它起作用。

如果有人想知道这两个进口商品之间的区别。检查以下内容。

  • java.sql.Date是一个围绕毫秒值的瘦包装器,它是 JDBC用于标识SQL DATE类型
  • java.sql.Date仅代表DATE,而没有时间信息,而 java.util.Date代表日期和时间信息。这是 java.util.Date为什么不能直接映射到的主要区别 java.sql.Date。

有关更多信息,请查看以下内容:

https://javarevisited.blogspot.com/2012/04/difference-between-javautildate-and.html#ixzz5KnvEjas7

答案 4 :(得分:0)

实际上两件事你必须考虑。

  1. 使用EvalAtIndex()

  2. 确保您的字段返回类型也是java.util.Date

    Date