Des idées sur la façon dont je pourrais résoudre cette erreur? J'utilise Spring JPA avec Hibernate. Détails nécessaires ci-dessous.
Classe d'entité 1:
@Entity
@Table(name = "ways")
@TypeDef(name = "hstore", typeClass = HstoreUserType.class)
@Cacheable
public class Way {
/**
* Primary key for the row in table.
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
/**
* The ID to represent it across the system.
* Used for preserving historical information.
*/
@Column(name = "way_id")
private Long wayId;
/**
* The version of the way this Object represents.
*/
@Column(name = "version")
private Integer version;
/**
* The {@link User} that edited this version.
*/
@OneToOne
@PrimaryKeyJoinColumn(name = "user_id")
private User user;
/**
* Timestamp when this version of the Way was edited.
*/
@Column(name = "tstamp")
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
/**
* The changeset that this version of the way belongs to.
*/
@Column(name = "changeset_id")
private Long changesetId;
/**
* All the tags this Way contains.
*/
@Type(type = "hstore")
@Column(name = "tags", columnDefinition = "hstore")
private Object2ObjectOpenHashMap<String, String> tags = new Object2ObjectOpenHashMap<String, String>();
@Column(name = "bbox")
private Geometry bbox;
@Column(name = "linestring")
private Geometry linestring;
@Column(name = "nodes")
private Long[] nodes;
// getters and setters
}
Classe d'entité pour l'utilisateur:
@Entity
@Table(name = "users")
@Cacheable
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "name", unique = true)
private String name;
// getters and setters
}
Et le stacktrace:
Le stacktrace est assez énorme. Je colle tout le stacktrace ci-dessous pour référence et un rapide TL; DR ici:
javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
Caused by: org.hibernate.type.SerializationException: could not deserialize
Caused by: Java.io.StreamCorruptedException: invalid stream header: 30313033
Le stacktrace complet suit:
javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.Java:1361)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.Java:1289)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.Java:261)
at org.hibernate.ejb.criteria.CriteriaQueryCompiler$3.getResultList(CriteriaQueryCompiler.Java:260)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.findAll(SimpleJpaRepository.Java:250)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:57)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:606)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFac
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySuppo
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.Java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.Java:155)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeReava:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.Java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.Java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.Java:202)
at com.Sun.proxy.$Proxy36.findAll(Unknown Source)
at com.osmrecommend.persistence.service.WayPersistenceServiceImpl.getAllWays(WayPersistenceServiceImpl.Java:32)
at com.osmrecommend.dao.WayDAO.getAllWays(WayDAO.Java:37)
at com.osmrecommend.cbf.TFIDFModelBuilder.get(TFIDFModelBuilder.Java:90)
at com.osmrecommend.cbf.TFIDFModelBuilder.get(TFIDFModelBuilder.Java:36)
at org.grouplens.grapht.util.MemoizingProvider.get(MemoizingProvider.Java:59)
at org.grouplens.lenskit.inject.StaticInjector.instantiate(StaticInjector.Java:130)
at org.grouplens.lenskit.inject.StaticInjector.apply(StaticInjector.Java:137)
at org.grouplens.lenskit.inject.StaticInjector.apply(StaticInjector.Java:47)
at org.grouplens.lenskit.eval.traintest.ComponentCache$NodeInstantiator.call(ComponentCache.Java:166)
at com.google.common.cache.LocalCache$LocalManualCache$1.load(LocalCache.Java:4792)
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.Java:3599)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.Java:2379)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.Java:2342)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.Java:2257)
at com.google.common.cache.LocalCache.get(LocalCache.Java:4000)
at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.Java:4789)
at org.grouplens.lenskit.eval.traintest.ComponentCache$Instantiator.apply(ComponentCache.Java:126)
at org.grouplens.lenskit.eval.traintest.ComponentCache$Instantiator.apply(ComponentCache.Java:104)
at org.grouplens.lenskit.inject.RecommenderInstantiator$1.apply(RecommenderInstantiator.Java:109)
at org.grouplens.lenskit.inject.RecommenderInstantiator$1.apply(RecommenderInstantiator.Java:99)
at org.grouplens.lenskit.inject.RecommenderInstantiator.replaceShareableNodes(RecommenderInstantiator.Java:188)
at org.grouplens.lenskit.inject.RecommenderInstantiator.instantiate(RecommenderInstantiator.Java:99)
at org.grouplens.lenskit.eval.traintest.LenskitEvalJob.buildRecommender(LenskitEvalJob.Java:74)
at org.grouplens.lenskit.eval.traintest.TrainTestJob.runEvaluation(TrainTestJob.Java:117)
at org.grouplens.lenskit.eval.traintest.TrainTestJob.call(TrainTestJob.Java:101)
at org.grouplens.lenskit.eval.traintest.JobGraph$JobNode.call(JobGraph.Java:116)
at org.grouplens.lenskit.eval.traintest.JobGraph$JobNode.call(JobGraph.Java:102)
at org.grouplens.lenskit.util.parallel.SequentialTaskGraphExecutor.execute(SequentialTaskGraphExecutor.Java:37)
at org.grouplens.lenskit.eval.traintest.TrainTestEvalTask.runEvaluations(TrainTestEvalTask.Java:468)
at org.grouplens.lenskit.eval.traintest.TrainTestEvalTask.perform(TrainTestEvalTask.Java:398)
at org.grouplens.lenskit.eval.traintest.SimpleEvaluator.call(SimpleEvaluator.Java:313)
at com.osmrecommend.app.OSMRecommendEval.main(OSMRecommendEval.Java:94)
Caused by: org.hibernate.type.SerializationException: could not deserialize
at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.Java:262)
at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.Java:306)
at org.hibernate.type.descriptor.Java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.Java:131)
at org.hibernate.type.descriptor.Java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.Java:117)
at org.hibernate.type.descriptor.Java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.Java:39)
at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.Java:67)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.Java:65)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.Java:269)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.Java:265)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.Java:238)
at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.Java:357)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.Java:2695)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.Java:1552)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.Java:1484)
at org.hibernate.loader.Loader.getRow(Loader.Java:1384)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.Java:640)
at org.hibernate.loader.Loader.doQuery(Loader.Java:856)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.Java:289)
at org.hibernate.loader.Loader.doList(Loader.Java:2463)
at org.hibernate.loader.Loader.doList(Loader.Java:2449)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.Java:2279)
at org.hibernate.loader.Loader.list(Loader.Java:2274)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.Java:470)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.Java:355)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.Java:196)
2014-04-13 17:35:49 INFO persistence.service.WayPersistenceServiceImpl:37 - All ways fetched in 331s
at org.hibernate.internal.SessionImpl.list(SessionImpl.Java:1115)
at org.hibernate.internal.QueryImpl.list(QueryImpl.Java:101)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.Java:252)
... 51 more
Caused by: Java.io.StreamCorruptedException: invalid stream header: 30313033
at Java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.Java:804)
at Java.io.ObjectInputStream.<init>(ObjectInputStream.Java:299)
at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.Java:328)
at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.Java:318)
at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.Java:237)
... 78 more
PDATE:
J'ai mis à jour la classe d'entités Ways comme suit, mais l'erreur persiste:
@Entity
@Table(name = "ways")
@Cacheable
public class Way implements Serializable {
/**
*
*/
private static final long serialVersionUID = -7941769011539363185L;
/**
* Primary key for the row in table.
*/
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
/**
* The ID to represent it across the system.
* Used for preserving historical information.
*/
@Column(name = "way_id")
private Long wayId;
/**
* The version of the way this Object represents.
*/
@Column(name = "version")
private Integer version;
/**
* The {@link User} that edited this version.
*/
@OneToOne
@PrimaryKeyJoinColumn(name = "user_id")
private User user;
/**
* Timestamp when this version of the Way was edited.
*/
@Column(name = "tstamp")
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
/**
* The changeset that this version of the way belongs to.
*/
@Column(name = "changeset_id")
private Long changesetId;
/**
* All the tags this Way contains.
*/
@Column(name = "tags")
private String tags;
@Column(name = "bbox")
private Geometry bbox;
@Column(name = "linestring")
private Geometry linestring;
@Column(name = "nodes")
@ElementCollection(targetClass=Long.class)
private List<Long> nodes;
Ce problème se produit lorsque quelque chose ne peut pas être désérialisé (merci Capitaine Évident). Dans vos mappages d'entités, les éléments suivants semblent suspects:
@Type(type = "hstore")
@Column(name = "tags", columnDefinition = "hstore")
private Object2ObjectOpenHashMap<String, String> tags = new Object2ObjectOpenHashMap<String, String>();
@Column(name = "bbox")
private Geometry bbox;
@Column(name = "linestring")
private Geometry linestring;
Ma suggestion est de jeter un oeil sur Geometry
et Object2ObjectHashMap
classes - vérifie si elles sont sérialisables elles-mêmes et tous leurs champs sont aussi sérialisables, ou marqués avec le mot clé transient
. De plus, si vous postez ces cours ici, cela peut également vous aider. La liste de classes HstoreUserType
peut également être utile.
Pour les autres avec la même erreur (ne répond pas à cette question exacte)
J'ai rencontré cette erreur avec hibernate 4.3 et 5.0.5 en raison de champs de type Java.time.LocalDateTime
J'ai plusieurs entités qui utilisent LocalDateTime, mais une seule d'entre elles est à l'origine du problème, je ne sais pas pourquoi.
Cela a été corrigé en ajoutant la dépendance suivante:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-Java8</artifactId>
<version>${hibernate.version}</version>
</dependency>
En ce qui concerne le kaba713 answer et convertir Java.time.*
par Hibernate.
J'utilise org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters;
et cela fonctionne avec Spring-Boot 1.5.4.
@Column(name = "order_date", nullable = false)
@Convert(converter = Jsr310JpaConverters.LocalDateTimeConverter.class)
private LocalDateTime orderDate;
Et nous n'avons pas besoin d'écrire un convertisseur personnalisé.
Le problème devrait concerner la relation géométrique, elle est mappée en tant que colonne régulière. Hibernate essaie donc de mapper une simple colonne sur un objet géométrique. J'avais un problème similaire et la solution consistait à définir explicitement la relation, quelque chose comme:
@OneToOne
@JoinColumn(name = "bbox")
private Geometry bbox;
En ce qui concerne le réponse de @molholm, je vous déconseille d'utiliser une dépendance dépréciée. Le problème spécifique est que les versions antérieures d'Hibernate ne convertissaient pas Java.time.*
par eux-mêmes, vous avez donc dû écrire un convertisseur. La dernière version (5.2.1.Final du 06/2016) semble avoir un convertisseur intégré. Mais je vous conseillerais quand même d'écrire le vôtre et de l'ajouter à votre attribut. C'est à dire.:
@Convert(converter = LocalDateConverter.class)
private LocalDate timestamp;
Et voici le convertisseur:
import Java.sql.Date;
import Java.time.LocalDate;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter
public class LocalDateConverter implements AttributeConverter<LocalDate, Date> {
@Override
public Date convertToDatabaseColumn(LocalDate entityValue) {
if (entityValue == null) {
return null;
}
return Date.valueOf(entityValue);
}
@Override
public LocalDate convertToEntityAttribute(Date databaseValue) {
if (databaseValue == null) {
return null;
}
return databaseValue.toLocalDate();
}
}
Je faisais face à ceci sur un @NamedNativeQuery
+ @SqlResultSetMapping
scénario. TargetClass de @ ConstructorResult avait un Enum personnalisé à l'intérieur. Le changer en String et le convertir plus tard en mon code a résolu le problème.
La réponse d'Alexey Simonov fonctionne presque pour moi. Cependant, je suis toujours obligé d'utiliser Java 7 et j'utilise le backport Java.time de ThreeTen .
Dans mon cas, je viens d'utiliser un convertisseur différent, adapté aux classes de backport:
@Column(name = "lastupdate", nullable = false)
@Convert(converter = ThreeTenBackPortJpaConverters.LocalDateConverter.class)
private LocalDate lastUpdate;
Assurez-vous que vos objets d'entité implémentent l'interface Serializable. Veuillez sélectionner l'option permettant de rendre vos objets sérialisables dans n'importe quel outil que vous utilisez.
Quelque chose comme ça
public class Way implements Serializable {
private static final long serialVersionUID = 1L;
Vos annotations de mappage d'entités (ou xml) ne correspondent pas à votre table de base de données. Donc, l'hydratation/la désérialisation a échoué.
Alors quelle colonne est le problème? Cela ne vous dit pas directement.
Un indice est le code hexadécimal à la fin, par exemple un en-tête de flux invalide: 53 ....
53 se trouve être le code ASCII pour "S". ( https://ascii.cl/ )
Vous pouvez obtenir l'hexagone comme ceci: select hex(MyColumn) from MyTable;
Vous pouvez donc regarder l'hex de colonnes suspectes jusqu'à ce que vous le trouviez.
En outre, vous pouvez supprimer les colonnes une par une du mappage d'entités (par exemple, commentez @Column et remplacez-le par @Transient) jusqu'à ce que cela fonctionne. Commencez par les éléments suspects, par exemple les enums ou les sérialiseurs personnalisés. Ou peut-être avec toutes les colonnes que vous venez d'ajouter qui auraient pu le casser.
J'ai fait face à ce problème:
HTTP Status 500 - Request processing failed; nested exception is org.hibernate.type.SerializationException: could not deserialize
Vous avez également la solution.
Pour moi côté db quelques lignes entrées manuellement les données après avoir essayé de récupérer les données levées exception supprimée les lignes entrées manuellement après que cette a essayé de récupérer les données afin que cette fois pas d'exception. Cela signifie que vous insérez les entités sérialisées en mode hibernate dans la base de données. La base stocke le format des objets sérialisés et récupère les lignes de la base de données par des entités sérialisées.
Ce type de problème est lié à la dépendance hibernate-spatiale du projet ou au dialecte hibernate dans le cas de la géométrie (dans Spring Boot, il s’agit de la propriété spring.jpa.database-platform)? Ça devrait aider.
Pour les autres avec le même problème où aucune des réponses précédentes n'a aidé à résoudre le problème:
TLDR : Vérifiez vos dépendances/bibliothèques référencées pour les doublons.
Le message d'erreur mentionné peut également s'afficher lorsqu'un projet contient déjà une version plus ancienne (ou identique) de la bibliothèque JTS vividsolutions/locationtech incluse, puis qu'ultérieurement hibernate-spatial a été ajouté au projet (livré avec sa propre dépendance de bibliothèque JTS ) Cela peut être particulièrement difficile à comprendre, quand hibernate-spatial réside dans un module différent (par exemple, osgi) et, par conséquent, aucun avertissement du compilateur n'indique les différentes versions de bibliothèque utilisées dans différentes parties de votre code.
Le code Sample du type d'objet "Geometry" faisant référence au démarreur de thread, la bibliothèque JTS (ou geolatte) a donc été très probablement utilisée, ce qui signifie également que l'hibernation spatiale a été très probablement utilisée.
J'ai eu un problème similaire avec l'exception, mais la cause était légèrement différente pour moi. Dans la génération POJO, un type de données Oracle "TIMESTAMP (6) WITH TIME ZONE" est devenu un objet de type Serializable
. Étant donné que cet attribut n'était pas pertinent pour moi, je l'ai simplement supprimé.