【问题标题】:"invalid stream header" exception - Lob with JPA and MySQL“无效的流标头”异常 - JPA 和 MySQL 的 Lob
【发布时间】:2012-12-23 01:43:03
【问题描述】:

我有一个这样定义的字段

@MappedSupperclass
public abstract class BaseItem {

    ...
    @Lob @Basic(fetch=FetchType.EAGER)
    private String description;
    ...
}

@Entity
public class Item extends BaseItem {
}

我使用的是 MySQL 5,desccription 字段类型是 TEXT

在尝试读取 Item 类型的对象时,我收到以下错误:

java.io.StreamCorruptedException: invalid stream header: 6576656E
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:782)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)
    at org.datanucleus.store.rdbms.datatype.BlobImpl.getObject(BlobImpl.java:121)
    at org.datanucleus.store.rdbms.mapping.AbstractLargeBinaryRDBMSMapping.getObjectForBytes(AbstractLargeBinaryRDBMSMapping.java:362)
    at org.datanucleus.store.rdbms.mapping.AbstractLargeBinaryRDBMSMapping.getObject(AbstractLargeBinaryRDBMSMapping.java:395)
    at org.datanucleus.store.mapped.mapping.AbstractContainerMapping.getObject(AbstractContainerMapping.java:228)
    at org.datanucleus.store.rdbms.fieldmanager.ResultSetGetter.fetchObjectField(ResultSetGetter.java:176)
    at org.datanucleus.state.AbstractStateManager.replacingObjectField(AbstractStateManager.java:2353)
    ...

您知道造成这种情况的可能原因是什么吗?

我正在使用 JDK6 和 DataNucleus 3.1.1。

【问题讨论】:

  • 这似乎是提供商特定的错误。 DataNucleus 使用术语功能,但他们对 @Lob 注释字段的处理似乎不符合 JPA 对我的要求。如果您作为 JPA 提供者被他们困住,那么您将不得不删除该注释。
  • @Perception,如果您有一些问题,“正确”的报告方式是在公共 JIRA 中提出问题,并使用测试用例进行演示(而不是第三方网站“投诉”)。 JPA 合规性由 TCK(尽可能完整)管理,并且通过了。数据的检索显然取决于数据如何存储在该列中(OP 未在此处定义),因此它是否被序列化对于任何理解及其处理(当然还有正在使用的软件版本)都是至关重要的,这里再次没有说明)。
  • @DataNucleus - 我自己没有这个问题(我们使用的是 Hibernate JPA 提供程序)。但是,@AdrianBer 发布的代码似乎表明处理 @Lob @Basic 字段的方式存在 DataNucleus 问题。也许请他提交错误报告?
  • @DataNucleus 我修改了我的帖子并包含了使用的版本。列类型为 TEXT,数据仅包含纯文本。
  • @Adrian Ber,我在当前的 DataNucleus 代码库上尝试了您的案例(这里只有我可用的东西),它将“描述”字段映射到 ClobRDBMSMapping),因此读取纯文本值没有问题。在日志中查看您的案例中使用的内容(我猜是 BlobRDBMSMapping,但日志会告诉您)。也许这是以前版本中的一个错误,但你可以知道的唯一方法是尝试最新版本。您应该查找的日志条目类似于 Field ... -> Column(s) ... 使用类型为 {...} 的映射 (org.datanucleus.store.rdbms.mapping.datastore.ClobRDBMSMapping )

标签: java mysql jpa lob


【解决方案1】:

删除 @Lob 注释解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多