Есть ли проблема со свойствами JPA Entities, Oracle 10g и Calendar Type? - PullRequest
2 голосов
/ 17 сентября 2008

При использовании сущностей JPA в сочетании с Oracle 10g наблюдается следующее очень раздражающее поведение.

Предположим, у вас есть следующая сущность.

@Entity
@Table(name = "T_Order")
public class TOrder implements Serializable {
    private static final long serialVersionUID = 2235742302377173533L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "activationDate")
    private Calendar activationDate;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Calendar getActivationDate() {
        return activationDate;
    }

    public void setActivationDate(Calendar activationDate) {
        this.activationDate = activationDate;
    }
}

Этот объект сопоставлен с Oracle 10g, поэтому в БД будет таблица T_ORDER с столбцом NUMBER первичного ключа "ID" и столбцом TIMESTAMP "ActivDate".

Предположим, я создал экземпляр этого класса с датой активации "15. Sep 2008 00:00 AM". Мой местный часовой пояс CEST, который GMT + 02: 00. Когда я сохраняю этот объект и выбираю данные из таблицы T_ORDER, используя sqlplus, я обнаруживаю, что в таблице фактически хранится «14. Sep 2008 22:00», что пока нормально, потому что часовой пояс ob db - GMT.

Но теперь раздражающая часть. Когда я читаю эту сущность обратно в свою программу JAVA, я обнаруживаю, что часовой пояс оракула игнорируется, и я получаю «14. Sep 2008 22:00 CEST», что, безусловно, неверно.

Таким образом, при записи в БД информация о часовом поясе будет использоваться, а при чтении она будет игнорироваться.

Есть ли какое-нибудь решение для этого там? Я полагаю, что самое простое решение - установить часовой пояс Oracle dbs на GMT + 02, но, к сожалению, я не могу этого сделать, поскольку другие приложения используют тот же сервер.

Мы используем следующую технологию

MyEclipse 6.5 JPA с Hibernate 3.2 Oracle 10g тонкий драйвер JDBC

Ответы [ 2 ]

2 голосов
/ 17 сентября 2008

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

@Temporal(TemporalType.TIMESTAMP)
@Column(name="activationDate")
public Date getActivationDate() {
    return this.activationDate;
}

java.util.Date указывает на момент времени, независимо от часовых поясов. Календарь можно использовать для форматирования даты для определенного часового пояса или локали.

0 голосов
/ 17 сентября 2008

У меня уже была доля проблем с JPA и временными метками. Я читал на форумах oracle и, пожалуйста, проверьте следующее:

  • Поле в базе данных должно быть TIMESTAMP_TZ, а не просто TIMESTAMP
  • Попробуйте добавить аннотацию @Temporal (значение = TemporalType.TIMESTAMP)
  • Если вам действительно не нужен часовой пояс, введите поле даты или отметки времени.
...