Comment carte postgresql “timestamp avec le temps, la zone de” dans une entité JPA 2
J'ai une JPA 2 de la demande ( avec mise en veille prolongée de 3,6 que l'implémentation JPA ) qui utilise Postgresql ( avec la 9.0-801.jdbc3 pilote JDBC ).
J'ai de la difficulté cartographie "timestamp avec le temps", la zone des champs dans mon entités JPA.
Voici un exemple:
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 )
)
J'ai essayé de carte comme suit:
@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 */
J'obtiens toujours une exception à la suite de la racine de la cause: Caused by: org.hibernate.HibernateException: Wrong column type in public.backend_themetopic for column created. Found: timestamptz, expected: date
Ce que j'ai essayé
- remplacement
java.util.Calendar
avecjava.util.Date
- ne fait pas de différence - à l'aide de
java.sql.Timestamp
- se plaint du fait que je ne peut pas appliquer la@Temporal
annotation d'unTimestamp
- à l'aide de
org.joda.time.DateTime
avec une coutume@Type
annotation (@Type(type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ")
) aussi n'a pas de travail
Contraintes
- Cette application interagit avec un "ancien système" - donc, un changement dans les types de champs de date n'est pas une bonne option
Ma question est: comment dois-je faire correspondre ces fuseau horaire courant des horodateurs dans mon entités JPA?
Vous devez vous connecter pour publier un commentaire.
J'ai finalement fait ce "travail" - dans un hackish en quelque sorte bien par la désactivation de la validation du schéma.
Auparavant, j'avais
<property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto"
dans mon persistence.xml. Quand j'ai commenté cette propriété, mon application serveur est démarré et le modèle "travaillé".La forme finale de mon entité:
Après avoir lu un peu sur ce, j'ai eu l'impression qu'il n'y a pas de moyen facile de carte Postgresql horodatage avec le temps, la zone de colonnes.
Certains implémentation JPA + base de données des combinaisons de soutenir ce mode natif ( EclipseLink + Oracle est un exemple ). Pour hibernate, avec jodatime extensions, il est possible de stocker le fuseau conscient des horodateurs, à l'aide d'un normal timestamp + un champ de type varchar pour le fuseau horaire( je ne pouvais pas le faire depuis que j'ai été contraint de changer le schéma de base de données ). Jadira types d'utilisateurs ou complètement personnalisé types d'utilisateurs peut également être utilisé pour s'attaquer à ce problème.
J'ai besoin d'à noter que mon cas d'utilisation de cette entité est en "lecture seule", j'ai donc pu m'en sortir avec une apparente naïveté de "solution".
Ajouter
@Column(columnDefinition= "TIMESTAMP WITH TIME ZONE")
columnDefinition
valeur utilisée uniquement en DDL. Toutefois, si votre colonne de table a été créée avec cette DDL, il aura des répercussions indirectes sur les spécificités du comportement d'exécution trop.