Pergunta

Estou enfrentando o seguinte comportamento muito irritante ao usar entidades JPA em conjunto com o Oracle 10g.

Suponha que você tenha a seguinte entidade.

@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;
    }
}

Esta entidade está mapeada para Oracle 10g, portanto no BD haverá uma tabela T_ORDER com uma chave primária NUMBER coluna "ID" e uma coluna TIMESTAMP "activationDate".

Suponhamos que eu crie uma instância desta classe com a data de ativação "15.Setembro de 2008 00h00 ".Meu fuso horário local é CEST, que é GMT+02:00.Quando persisto esse objeto e seleciono os dados da tabela T_ORDER usando sqlplus, descubro que na tabela na verdade "14.Setembro de 2008 22:00" está armazenado, o que está ok até agora, porque o fuso horário do Oracle DB é GMT.

Mas agora a parte chata.Quando leio essa entidade em meu programa JAVA, descubro que o fuso horário do Oracle é ignorado e recebo "14.Setembro de 2008 22:00 CEST", o que é definitivamente errado.

Então basicamente, ao escrever no banco de dados será utilizada a informação de fuso horário, ao ler ela será ignorada.

Existe alguma solução para isso por aí?A solução mais simples, eu acho, seria definir o fuso horário do oracle dbs para GMT + 02, mas infelizmente não posso fazer isso porque há outros aplicativos usando o mesmo servidor.

Usamos a seguinte tecnologia

Myeclipse 6.5 JPA com Hibernate 3.2 Oracle 10g Fin Driver JDBC

Foi útil?

Solução

Você não deve usar um calendário para acessar datas do banco de dados, por esta razão exata. Você deve usar java.util.Date assim:

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

pontos java.util.Date para um momento no tempo, independentemente de quaisquer fusos horários. Calendário pode ser usado para formatar uma data para um fuso horário ou local específico.

Outras dicas

Eu já tive minha cota de problemas com JPA e timestamps. Estive lendo nas fóruns oracle por favor verifique o seguinte :

  • O campo no banco de dados deve ser TIMESTAMP_TZ e não apenas TIMESTAMP
  • Tente adicionar a anotação @Temporal (valor = TemporalType.TIMESTAMP)
  • Se você realmente não precisa de fuso horário, coloque em um campo de data ou data e hora.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top