Почему hbm2ddl не нравится моя аннотация @Temporal в GregorianCalendar?

Вот фон: у меня есть аннотированный @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 2ddl (default-cli) в проекте STRIPES_V2: Выполнение default-cli цели org.code haus.mojo: hibernate3-maven-plugin: 2.2: ошибка hbm2ddl: @Temporal следует указывать только в свойстве java.util.Date или java.util.Calendar: stripes.datamodel. util.OperationalStatus.time

Вот некоторые выдержки из пом:

<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 является конкретным расширением календаря, так что не так?

1 ответ

Решение

Ничто в спецификации не ограничивает провайдера способностью предлагать любую конкретную произвольную реализацию Календаря, которую вы хотите, поэтому было бы проблемой совместимости, если бы они позволили вам требовать, чтобы он предоставил конкретную. (Не то, чтобы кто-то в здравом уме создал бы новый подкласс Calendar, но такая возможность есть. Реализация JPA, которая знала только, как вернуть собственный настраиваемый подкласс Calendar, на самом деле ничего не ошиблась бы в спецификации, вы не может требовать, чтобы он знал, как использовать GregorianCalendar вместо этого.)

Или, с другой стороны, если бы я должен был создать org.affe.MyAwesomeCalendar, не стоит ожидать, что провайдер JPA сможет сделать его для меня!

11.1.47 Временная аннотация

Временная аннотация должна быть указана для постоянных полей или свойств типа java.util.Date и java.util.Calendar. Это может быть указано только для полей или свойств этих типов.

Hibernate не позволит вам выбрать java.sql.Date и т. Д. Напрямую. По сути, они интерпретируют, что поставщику персистентности предстоит определить, какая реализация Календаря используется.

Другие вопросы по тегам