Tengo un JPA 2 de la aplicación ( con Hibernate 3.6 como la implementación de JPA ) que utiliza Postgresql ( con el 9.0-801.jdbc3 controlador JDBC ).

Estoy teniendo problemas con la asignación de «marca de tiempo con el tiempo de la zona de los campos» en mi entidades JPA.

Aquí está un ejemplo:

CREATE TABLE theme
(
  id serial NOT NULL,
  # Fields that are not material to the question have been edited out
  run_from timestamp with time zone NOT NULL,
  run_to timestamp with time zone NOT NULL,
  CONSTRAINT theme_pkey PRIMARY KEY (id ),
  CONSTRAINT theme_name_key UNIQUE (name )
)

He tratado de hacer un mapa de la siguiente manera:

@Entity
@Table(schema = "content", name = "theme")
public class Theme extends AbstractBaseEntity {
    private static final long serialVersionUID = 1L;

    @Column(name = "run_from")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runFrom;

    @Column(name = "run_to")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runTo;

    /* The rest of the entity has been edited out */

Sigo recibiendo una excepción con el siguiente causa: Caused by: org.hibernate.HibernateException: Wrong column type in public.backend_themetopic for column created. Found: timestamptz, expected: date

Lo que he intentado

  • sustitución de java.util.Calendar con java.util.Date – no hizo ninguna diferencia
  • utilizando java.sql.Timestamp – se quejó que no puedo aplicar el @Temporal anotación a un Timestamp
  • utilizando org.joda.time.DateTime con una costumbre @Type anotación ( @Type(type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ") ) también no trabajo

Restricciones

  • Esta aplicación interactúa con un «legado » sistema» – así, cambiar los tipos de los campos de fecha no es una buena opción

Mi pregunta es: ¿cómo debo mapa de zona horaria de estos consciente de las marcas de tiempo en mi entidades JPA?

InformationsquelleAutor Ngure Nyaga | 2012-11-13

2 Comentarios

  1. 8

    Finalmente he hecho este «trabajo» – en un hackish especie de manera de desactivar la validación de esquema.

    Previamente, yo había <property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto" en mi persistence.xml. Cuando me comentó esta propiedad, mi aplicación servidor se ha iniciado y el modelo de «trabajado».

    La forma final de mi entidad fue:

    @Entity
    @Table(schema = "content", name = "theme")
    public class Theme extends AbstractBaseEntity {
        private static final long serialVersionUID = 1L;
    
        @Column(name = "run_from", columnDefinition = "timestamp with time zone not null")
        @NotNull
        @Temporal(TemporalType.TIMESTAMP)
        private Date runFrom;
    
        @Column(name = "run_to", columnDefinition = "timestampt with time zone not null")
        @NotNull
        @Temporal(TemporalType.TIMESTAMP)
        private Date runTo;
    
        /* Getters, setters, .hashCode(), .equals() etc omitted */

    Después de leer un poco sobre esto, tengo la impresión es que no hay manera fácil de mapa de Postgresql marca de tiempo con el tiempo de la zona de las columnas.

    Algunos implementación de JPA + base de datos de combinaciones de soporte de esta forma nativa ( EclipseLink + Oracle es un ejemplo ). Para hibernar, con jodatime extensiones, es posible almacenar la zona horaria en cuenta las marcas de tiempo utilizando un normal timestamp + un varchar de campo para la zona horaria( yo no podía hacer eso ya que me obligó a cambiar el esquema de base de datos ). Jadira tipos de usuario o completamente personalizados de tipos de usuario puede también ser utilizado para hacer frente a este problema.

    Tengo que señalar que mi caso de uso para esta entidad es de «sólo lectura», así que podría conseguir lejos con un aparentemente ingenuo «solución».

  2. 6

    Agregar @Column(columnDefinition= "TIMESTAMP WITH TIME ZONE")

    @Column(name = "run_from", columnDefinition= "TIMESTAMP WITH TIME ZONE")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runFrom;
    • Esto es realmente útil sólo para los DDL auto o durante el tiempo de ejecución, también?
    • columnDefinition valor que se utiliza sólo en los DDL. Sin embargo, si su columna de la tabla fue creada con DDL que, indirectamente, afectan a aspectos específicos de comportamiento en tiempo de ejecución también.

Dejar respuesta

Please enter your comment!
Please enter your name here