web-dev-qa-db-ja.com

Hibernate:デシリアライズできませんでした-無効なストリームヘッダー

このエラーを解決する方法についてのアイデアはありますか? HibernateでSpring JPAを使用しています。以下に必要な詳細。

エンティティクラス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
}

ユーザーのエンティティクラス:

@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

}

およびスタックトレース:

スタックトレースは非常に巨大です。参照用に以下のスタックトレース全体を貼り付け、ここに簡単なTL; DRを貼り付けています:

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

完全なスタックトレースは次のとおりです。

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

更新:

Waysエンティティクラスを次のように更新しましたが、エラーが引き続き発生します。

@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;
32
bcosynot

この問題は、何かをデシリアライズできない場合に発生します(ありがとう、Captain Obvious)。エンティティマッピングでは、以下が疑わしいように見えます。

@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;

私の提案は、GeometryおよびObject2ObjectHashMapクラスを調べることです-それら自体が直列化可能かどうかを確認しますandすべてのフィールドシリアライズ可能であるか、transientキーワードでマークされています。また、これらのクラスをここに投稿すると、これも役立ちます。 HstoreUserTypeクラスのリストも役立つ場合があります。

27
Alexey Malev

同じエラーを持つ他の人(この正確な質問には答えない)

タイプJava.time.LocalDateTimeのフィールドが原因でhibernate 4.3および5.0.5でこのエラーが発生しました。LocalDateTimeを使用するエンティティがいくつかありますが、そのうちの1つだけが問題の原因でした。理由はわかりません。

次の依存関係を追加することで修正されました。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-Java8</artifactId>
    <version>${hibernate.version}</version>
</dependency>
61
molholm

kaba713 answer および変換Java.time.* by Hibernate。

私が使う org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters;およびSpring-Boot 1.5.4で動作します。

@Column(name = "order_date", nullable = false)
@Convert(converter = Jsr310JpaConverters.LocalDateTimeConverter.class)
private LocalDateTime orderDate;

また、カスタムコンバーターを記述する必要はありません。

9
Alexey Simonov

問題はGeometryリレーションにあるはずです。通常の列としてマップされるため、Hibernateは単純なColumnをGeometryオブジェクトにマップしようとします。私は同様の問題を抱えていましたが、解決策は関係を明示的に定義することでした:

@OneToOne
@JoinColumn(name = "bbox")
private Geometry bbox;
8
Felipe Cadena

@ -molholmの answer については、非推奨の依存関係を使用しないことをお勧めします。特定の問題は、Hibernateの以前のバージョンがJava.time.*彼ら自身によって、あなたはコンバータを書かなければなりませんでした。最新バージョン(2016年6月の5.2.1.Final)には、統合されたコンバーターがあるようです。ただし、独自に作成して属性に追加することをお勧めします。つまり:

@Convert(converter = LocalDateConverter.class)
private LocalDate timestamp;

そして、ここにコンバータがあります:

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();
    }
}
7
kaba713

私は@NamedNativeQuery + @SqlResultSetMappingシナリオ。 @ConstructorResultのtargetClassには、内部にカスタムEnumがありました。それを文字列に変更し、後でコードで変換すると、問題が解決しました。

2
Anand Rockzz

Alexey Simonovからの答えは、ほとんど私にとってはうまくいきます。ただし、Java 7を使用することを強制されており、 ThreeTen からJava.timeバックポートを使用しています。

私の場合、バックポートされたクラスに適した別のコンバーターを使用しました。

@Column(name = "lastupdate", nullable = false)
@Convert(converter = ThreeTenBackPortJpaConverters.LocalDateConverter.class)
private LocalDate lastUpdate;
2

エンティティオブジェクトがSerializableインターフェイスを実装していることを確認してください。使用しているツールでオブジェクトをシリアル化できるオプションを選択してください。

このようなもの

public class Way implements Serializable {
    private static final long serialVersionUID = 1L;
2

エンティティマッピングアノテーション(またはxml)がdbテーブルと一致しません。そのため、水和/逆シリアル化に失敗しました。

では、どの列が問題なのでしょうか?それはあなたに直接教えてくれません。

1つの手がかりは、末尾の16進コードです。たとえば、無効なストリームヘッダー:53 ....

53はたまたま "S"のASCIIコードです。 ( https://ascii.cl/

次のようにヘックスを取得できます:select hex(MyColumn) from MyTable;

だから、あなたはそれが見つかるまで、疑わしいコラムのヘックスを見ることができます。

また、エンティティマッピングから列を1つずつ削除することもできます(たとえば、@ Columnをコメントアウトして@Transientに置き換えます)。列挙型やカスタムシリアライザーなどの疑わしいものから始めます。または、追加したばかりの列が壊れている可能性があります。

1
Curtis Yallop

私はこの問題に直面しました:

HTTP Status 500 - Request processing failed; nested exception is org.hibernate.type.SerializationException: could not deserialize

Gotソリューションも。

私のDB側では、いくつかの手動で入力された行データが例外を取得しようとした後、データを取得しようとした後、手動で入力された行を削除しました。 データベースにhibernateを介してデータシリアル化されたエンティティを挿入することを意味します。DBはシリアル化されたオブジェクト形式を格納し、シリアル化されたエンティティを介してdb行を取得します。

1
user8495084

このタイプの問題は、プロジェクトへのhibernate-spatialの依存関係に関連するのか、ジオメトリの場合のhibernateダイアレクトに関連するのか(Spring Bootではspring.jpa.database-platformプロパティ)役立つはずです。

1
Nimesh

以前の回答のどれもが問題の解決に役立たない同じ問題を抱えている他の人のために:

[〜#〜] tldr [〜#〜]:依存関係/参照ライブラリの重複を確認します。

上記のエラーメッセージは、プロジェクトにすでに古い(または同じ)バージョンのvividsolutions/locationtech JTSライブラリが含まれている場合に表示され、その後hibernate-spatialがプロジェクトに追加されます(これは独自のJTSライブラリ依存関係とともに出荷されます) )。 hibernate-spatialが異なる(たとえばosgi)モジュールにあるため、コードのさまざまな部分で使用されているさまざまなライブラリバージョンを示すコンパイラ警告が表示されない場合、これは特にわかりにくい場合があります。

スレッドスターターのサンプルコードはオブジェクトタイプ「Geometry」を参照するため、JTS(またはgeolatte)ライブラリが使用される可能性が非常に高く、これはhibernate-spatialが使用される可能性が高いことも意味します。

0
user7563540

私は例外で同様の問題を抱えていましたが、原因は私にとってわずかに異なっていました。 POJO生成では、Oracleデータ型「TIMESTAMP(6)WITH TIME ZONE」がSerializable型のオブジェクトになりました。この属性は私には関係ないため、削除しました。

0
MavidDeyers