【发布时间】: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 )