为什么hbm2ddl不喜欢我在GregorianCalendar上的@Temporal注释?

时间:2012-11-06 16:18:25

标签: java hibernate maven hbm2ddl hibernate3-maven-plugin

以下是背景信息:我有一个注释@Embeddable Java类,其中包含GregorianCalendar字段。我试图使用hibernate3:hbm2ddl通过hibernate3 Maven插件生成一个模式,这样我就可以持久保存另一个嵌入它的对象,但是在使用@Temporal时遇到了错误。

这是可嵌入的类:

@Embeddable
public class OperationalStatus implements Serializable {
        .
        .
        .
    /**
     * Recorded date/time that the status value is valid
     */
    private GregorianCalendar time;

    /**
     * No-argument constructor.
     */
    public OperationalStatus() {}
        .
        .
        .
    /**
     * @return the time
     */
    @Temporal(TemporalType.TIMESTAMP) 
    public GregorianCalendar getTime() {
        return time;
    }

    /**
     * @param time the time to set
     */
    public void setTime(GregorianCalendar time) {
        this.time = time;
    }
}

这是错误读数:

  

[错误]无法执行目标org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm   项目STRIPES_V2上的2ddl(default-cli):目标org.code的执行default-cli   haus.mojo:hibernate3-maven-plugin:2.2:hbm2ddl失败:@Temporal应该只是s   et on java.util.Date或java.util.Calendar属性:stripes.datamodel。   util.OperationalStatus.time

以下是pom的一些摘录:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
    <components>
        <component>
            <name>hbm2ddl</name>
            <implementation>annotationconfiguration</implementation>
        </component>
    </components>
    <componentProperties>
        <drop>false</drop>
        <configurationfile>src/main/resources/hibernate.cfg.xml</configurationfile>
        <outputfilename>schema.sql</outputfilename>
    </componentProperties>
</configuration>
<dependencies>
    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.2-1000.jdbc4</version>
    </dependency>
</dependencies>
</plugin>
.
.
.
<dependency>
    <groupId>org.hibernate</groupId>
    <version>4.1.7.Final</version>
    <artifactId>hibernate-core</artifactId>
</dependency>

我错过了什么? GregorianCalendar是Calendar的具体扩展,那有什么不对?

1 个答案:

答案 0 :(得分:1)

规范中没有任何内容限制提供程序能够销售您想要的任何特定任意日历实现,因此如果它们允许您要求它提供特定的日历,则会出现兼容性问题。 (并不是说他们心智正常的人会创建一个新的Calendar子类,但可能性就在那里。只知道如何返回自己的Calendar自定义子类的JPA实现在规范中的任何内容都不会出错。不能要求它知道如何使用GregorianCalendar。)

或者另一方面,如果我要创建org.affe.MyAwesomeCalendar,那么期望JPA提供商能够为我创建实例是不合理的!

  

11.1.47时间注释

     

必须为持久字段或java.util.Date类型的属性指定Temporal注释   java.util.Calendar中。它只能为字段或属性指定   这些类型。

Hibernate也不会让你直接选择java.sql.Date等。基本上,他们会将其解释为留给持久性提供程序来确定使用Calendar的实现。