Pregunta

Estoy experimentando la siguiente muy molesto comportamiento a la hora de usar JPA entitys en conjunto con Oracle 10g.

Suponga 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 se asigna a Oracle 10g, por lo que en la DB habrá una mesa T_ORDER con una clave principal NÚMERO de la columna "ID" y una columna TIMESTAMP "activationDate".

Supongamos puedo crear una instancia de esta clase con la fecha de activación "15.Sep 2008 00:00 AM".Mi local de la zona horaria CEST que es GMT+02:00.Cuando me persistir este objeto y seleccione los datos de la tabla T_ORDER el uso de sqlplus, me encuentro que en la tabla de la realidad "14.Sep 2008 22:00" se almacena, que va bien por ahora, porque el oracle base de datos de la zona horaria es GMT.

Pero ahora los molesto parte.Cuando leí esta entidad de nuevo en mi programa JAVA, me doy cuenta de que el oráculo de la zona horaria es ignorado y me sale "14.Sep 2008 22:00 CEST", que está definitivamente mal.

Así que, básicamente, cuando la escritura a la base de datos la información de la zona horaria será utilizado, cuando la lectura será ignorado.

Existe alguna solución para esto existe?La solución más sencilla supongo que sería el de oracle dbs zona horaria a GMT+02, pero desgraciadamente yo no puedo hacer esto porque hay otras aplicaciones que usan el mismo servidor.

Utilizamos la tecnología siguientes

MyEclipse 6.5 JPA con Hibernate 3.2 Oracle 10g delgada Controlador JDBC

¿Fue útil?

Solución

Usted no debe usar un Calendario para acceder a la data de la base de datos, por esta razón exacta.Usted debe utilizar java.util.Date así como:

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

java.util.Date puntos a un momento en el tiempo, independientemente de las zonas horarias.El calendario puede ser utilizado para dar formato a una fecha para una determinada zona horaria o regional.

Otros consejos

Yo ya tuve mi cuota de problemas con JPA y marcas de tiempo.He estado leyendo en el oracle foros y por favor, compruebe los siguientes:

  • El campo en la base de datos debe ser TIMESTAMP_TZ y no sólo marca de tiempo
  • Trate de añadir la anotación @Temporales(valor = TemporalType.Fecha y hora)
  • Si usted realmente no necesita la zona horaria, poner en una fecha o campo de marca de hora.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top