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


person skippy    schedule 06.11.2012    source источник
comment
Какую версию Hibernate вы используете?   -  person ElderMael    schedule 06.11.2012
comment
Добавлена ​​информация о POM. к тексту вопроса.   -  person skippy    schedule 06.11.2012


Ответы (1)


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

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

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

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

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

person Affe    schedule 06.11.2012
comment
Черт возьми. Любые предложения о том, как лучше всего справиться с этим в моем случае? - person skippy; 06.11.2012
comment
Если вы готовы специально использовать спящий режим и не придерживаетесь JPA, создать такой тип пользователя будет несложно, вероятно, есть множество примеров того, как люди это делают. Вы также можете использовать временное поле, возможно, для хранения GregorianCalendar, который вы создаете, если вам действительно нужно, чтобы API был GregorianCalendar, а не Calendar по какой-то причине. - person Affe; 06.11.2012