JPA и GregorianCalendar - PullRequest
       14

JPA и GregorianCalendar

5 голосов
/ 19 июля 2010

Поддерживает ли JPA 1.0 отображение GregorianCalendar?Я не нашел ничего в спецификации файла сопоставления JPA 1.0 о GregorianCalendar.А как насчет JPA 2.0?

Ответы [ 4 ]

18 голосов
/ 20 июля 2010

JPA поддерживает java.util.Calendar и его подклассы. Единственное предостережение в том, что вы должны использовать аннотацию @Temporal, чтобы указать, как поле хранится в базе данных. Обе версии спецификации имеют это требование, вот раздел из спецификации JPA 2.0:

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

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

Временная аннотация может использоваться вместе с основной аннотацией, аннотацией Id или аннотацией ElementCollection [111] (когда значение коллекции элементов имеет такой временной тип).

Перечисление TemporalType определяет отображение для этих временных типов.

public enum TemporalType {
DATE, //java.sql.Date
TIME, //java.sql.Time
TIMESTAMP //java.sql.Timestamp
}

В противном случае вам не нужно делать ничего особенного. Ваша сущность может выглядеть примерно так:

@Entity 
public class Person { 
    // . . .

    @Temporal(TemporalType.TIMESTAMP)
    private GregorianCalendar lastUpdated;

    // . . .
}
5 голосов
/ 19 июля 2010

JPA позволяет отображать java.util.Calendar (и его подкласс).Из спецификации JPA 1.0:

9.1.18 Основная аннотация

Основная аннотация - это простейший тип отображения на столбец базы данных.Аннотация Basic может применяться к постоянному свойству или переменной экземпляра любого из следующих типов: примитивные типы Java, обертки примитивных типов, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[], Character[], перечисления и любые другие типы, которые реализуют Serializable.Как описано в разделе 2.1.6, использование основной аннотации необязательно для постоянных полей и свойств этих типов.

1 голос
/ 05 сентября 2011

Вы должны следить за использованием календарей или дат в JPA или JDBC в целом, поскольку они обычно хранятся без информации о часовом поясе.Таким образом, ваше приложение будет восприимчиво к летнему времени и различиям в часовых поясах.

В JPA я делаю следующее:

Я создаю методы получения и установки с использованием Date или любых временных объектов Java, которые выудобны (я предпочитаю Date из-за его неизменности), но фактический столбец является длинным или длинным (к сожалению, это подразумевает, что необходимо выполнить нулевую проверку)

private Long timestamp;
public void setTimestamp(final Date timestamp) {
    if (timestamp == null) {
        this.timestamp = null;
    } else {
        this.timestamp = timestamp.getTime();
    }
}
public Date getTimestamp() {
    if (timestamp == null) {
        return null;
    }
    return new Date(timestamp);
}

Это дает пользователям сущности гибкость JavaДата без необходимости заботиться о часовом поясе и летнем времени.

0 голосов
/ 19 июля 2010

Вы можете отобразить java.util.Calendar без специального сопоставления.

Это даст вам тот же результат.

...