Java 8 LocalDate en veille prolongée, à tort, mappé à TIMESTAMP
- Je utiliser le Printemps de démarrage 1.4.2, qui apporte hibernate 5.0.11 (JPA 2.1).
Je veux utiliser le Java 8 classes de temps dans mes entités, et donc inclus hibernate-java8
.
Mon entité définit un LocalDate champ.
@Entity
@Table(name = "my_alarms_timeline", indexes = {...})
public class MyAlarm {
...
@Column(name = "validity_date")
@NotNull
private LocalDate validityDate;
}
Je m'attends à être mappé à une DATE dans mon H2 base de données.
Dans ma DB j'ai déclarer ce que validity_date DATE NOT NULL,
.
Lorsque j'essaie d'exécuter des tests, j'obtiens l'erreur suivante:
[INFO] Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [validity_date] in table [my_alarms_timeline]; found [date (Types#DATE)], but expecting [timestamp (Types#TIMESTAMP)]
À ma grande surprise, si je change la DB définition de validity_date TIMESTAMP NOT NULL,
je reçois le message d'erreur
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: wrong column type encountered in column [validity_date] in table [my_alarms_timeline]; found [timestamp (Types#TIMESTAMP)], but expecting [date (Types#DATE)]
C'est tout l'inverse message de la précédente.
J'ai aussi essayé, au lieu de hibernate-java8
, pour utiliser un AttributeConverter<LocalDate, java.sql.Date>
mais cela produit le même résultat de l'erreur.
Que dois-je faire pour que mes LocalDate est correctement mappés à une DATE dans la DB?
J'ai aussi essayé avec un LocalDateTime
champ mappé à un TIMESTAMP, et cela fonctionne sans problèmes...
OriginalL'auteur Philipp | 2016-11-09
Vous devez vous connecter pour publier un commentaire.
Donc je l'ai eu à exécuter, par l'ajout d'un
columnDefinition="DATE"
à la@Column
annotation.Ne sais pas pourquoi personne d'autre, c'est de voir cette question...
eu ce
[Request processing failed; nested exception is org.springframework.orm.jpa.JpaSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize] with root cause java.io.StreamCorruptedException: invalid stream header: 32303138 at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:863) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:355) at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:309)
OriginalL'auteur Philipp
Je n'ai pas utilisé ce Printemps, mais dans la "norme" JPA, j'ai fait quelque chose comme:
Ma table a "timestamp avec le fuseau horaire" de colonnes. Mon @Entité utilise ensuite OffsetDateTime. Vous devriez être en mesure de convertir entre vos types de données avec quelque chose comme ça.
OriginalL'auteur stdunbar
Je soupçonne que vous avez le code suivant quelque part dans votre projet:
Si vous êtes en utilisant Hibernate 5.x, vous devez supprimer la référence à l'Jsr310JpaConverters.class sinon les deux Hibernate et Spring va tenter de gérer Java 8 Date et l'Heure des objets. Cela peut entraîner des très inconstante comportement (LocalDate d'instances persistantes avec la bonne valeur lors de l'exécution sur des machines qui n'utilisent pas l'UTC).
Vous devez également supprimer toutes les occurrences de:
Si vous avez besoin d'elle, c'est une indication que quelque chose va mal avec votre hibernate.
OriginalL'auteur Thomas Turrell-Croft