1

背景は次のとおりです。フィールドを持つ注釈付きの@EmbeddableJava クラスがあり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;
    }
}

そして、ここにエラーの読み出しがあります:

[エラー] プロジェクト STRIPES_V2 でゴール org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm 2ddl (default-cli) を実行できませんでした: ゴール org.code haus.mojo:hibernate3-maven-plugin のデフォルト cli を実行します:2.2:hbm2ddl が失敗しました: @Temporal は、java.util.Date または java.util.Calendar プロパティでのみ設定する必要があります: strips.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 の具体的な拡張機能ですが、何が問題なのですか?

4

1 に答える 1

1

仕様には、必要な Cal​​endar の特定の任意の実装を提供できるようにプロバイダーを制限するものはありません。そのため、特定のカレンダーを提供することを要求できる場合、互換性の問題になります。(正気の誰かが Calendar の新しいサブクラスを作成するというわけではありませんが、その可能性はあります。Calendar の独自のカスタム サブクラスを返す方法しか知らない JPA 実装は、仕様の何によっても実際には間違っていません。代わりに GregorianCalendar を使用する方法を知るように要求することはできません。)

逆に、org.affe.MyAwesomeCalendar を作成する場合、JPA プロバイダーがそのインスタンスを作成できると期待するのは合理的ではありません。

11.1.47 時間注釈

java.util.Date および java.util.Calendar 型の永続フィールドまたはプロパティには、Temporal アノテーションを指定する必要があります。これらのタイプのフィールドまたはプロパティに対してのみ指定できます。

Hibernate では、java.sql.Date などを直接選択することもできません。基本的に、彼らは、Calendar のどの実装が使用されているかを決定するのは永続化プロバイダーに任されていると解釈します。

于 2012-11-06T16:41:39.593 に答える