namedquery example ejemplos ejemplo java oracle jpa ejb-3.0

java - example - ¿Hay algún problema con las entidades JPA, Oracle 10g y las propiedades del tipo de calendario?



java jpa example (2)

No debe usar un Calendario para acceder a las fechas de la base de datos, por este motivo exacto. Deberías usar java.util.Date así:

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

java.util.Date señala un momento en el tiempo, independientemente de cualquier zona horaria. El calendario se puede usar para formatear una fecha para una zona horaria o localidad específica.

Estoy experimentando el siguiente comportamiento muy molesto cuando uso entidades JPA junto con Oracle 10g.

Supongamos que tiene la siguiente entidad.

@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 entidad está asignada a Oracle 10g, por lo que en la base de datos habrá una tabla T_ORDER con una clave principal NUMBER columna "ID" y una columna TIMESTAMP "activationDate".

Supongamos que creo una instancia de esta clase con la fecha de activación "15. Sep 2008 00:00 AM". Mi zona horaria local es CEST, que es GMT + 02: 00. Cuando persisto este objeto y selecciono los datos de la tabla T_ORDER usando sqlplus, descubro que en la tabla en realidad "14. Sep 2008 22:00" está almacenado, lo que está bien hasta ahora, porque la zona horaria de Oracle db es GMT.

Pero ahora la parte molesta. Cuando leo esta entidad de nuevo en mi programa JAVA, descubro que la zona horaria de Oracle se ignora y me sale "14. Sep 2008 22:00 CEST", lo cual es definitivamente incorrecto.

Entonces, básicamente, cuando se escribe en el DB la información de la zona horaria será utilizada, cuando se lea será ignorada.

¿Hay alguna solución para esto por ahí? La solución más simple, supongo, sería establecer el oracle dbs timezone en GMT + 02, pero desafortunadamente no puedo hacer esto porque hay otras aplicaciones que usan el mismo servidor.

Usamos la siguiente tecnología

MyEclipse 6.5 JPA con Hibernate 3.2 Oracle 10g controlador JDBC delgado


Ya tuve mi parte de problemas con JPA y marcas de tiempo. He estado leyendo en los foros del oráculo y compruebe lo siguiente:

  • El campo en la base de datos debe ser TIMESTAMP_TZ y no solo TIMESTAMP
  • Intente agregar la anotación @Temporal (value = TemporalType.TIMESTAMP)
  • Si realmente no necesita la zona horaria, coloque un campo de fecha o marca de tiempo.