1

我正在使用下面的 jar 来运行 jpa 程序,但出现异常:

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

例外是:

org.hibernate.AnnotationException:@Temporal 只能在 java.util.Date 或 java.util.Calendar 属性上设置: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&lt;Project, Date> currentProjects) {
        this.currentProjects = currentProjects;
    }


4

6 回答 6

8

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

import java.sql.Date;

代替

import java.util.Date;

希望这可能会有所帮助

于 2013-07-17T14:54:10.083 回答
2

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

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)

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

import java.sql.Date;

删除导入语句并使用以下内容,

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

于 2018-07-09T23:50:26.013 回答
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 是有意义的。

于 2012-07-11T12:53:55.770 回答
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;
    }
于 2013-08-04T11:20:21.890 回答
0

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

  1. 采用java.util.Date

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

    @UpdateTimestamp
    @Temporal(TemporalType.DATE)
    @Getter
    @Setter
    private Date DATE_MODIFIED;
    
于 2020-08-18T08:17:16.463 回答
0

正确的

@Temporal只能在java.util.Dateorjava.util.Calendar属性上设置

此错误将使用“ java.util.Date”而不是“ java.sql.date”解决

使用你创建你的getter和setter的地方像“ import java.util.date”一样导入它

它会工作......

于 2021-09-12T10:01:08.760 回答