hibernate - 无法在休眠 5 中反序列化在休眠 3 中序列化的 blob
问题描述
我们正在将我们的应用程序从 Hibernate 3 迁移到 Hibernate 5.4 版本。
在 Hibernate 3 中,使用以下代码创建了 blob
ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(object); byte[] voBytes = byteOut.toByteArray(); Blob voBlob = Hibernate.createBlob(voBytes);
voBlob 存储在列中(作为 blob) - Oracle 数据库表
现在迁移后,当我们尝试读取 blob 并将其反序列化时,如下所示
try(ObjectInputStream in = new ObjectInputStream(blob.getBinaryStream())) { obj = in.readObject(); }
我们收到错误,上面写着
java.lang.ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo.javassist 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass。 SerializableProxy 在 java.base/java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2190) 在 java.base/java.io.ObjectStreamClass$FieldReflector.checkObjectFieldValueTypes(ObjectStreamClass.java:2153) 在 java.base/java。 io.ObjectStreamClass.checkObjFieldValueTypes(ObjectStreamClass.java:1407) 在 java.base/java.io.ObjectInputStream.defaultCheckFieldValues(ObjectInputStream.java:2426) 在 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2333)在 java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream。readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2410) 在 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2304) 在 java.base /java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java :2410) 在 java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io 的 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2304)。在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.) 的 ObjectInputStream.readObject0(ObjectInputStream.java:1646)java:422) 在 java.base/jdk.internal 的 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 的 java.base/java.util.HashMap.readObject(HashMap.java:1460)。 reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method. java:566)在 java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1160) 在 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2271) 在 java.base/java.io .ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2410) 在爪哇。base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2304) 在 java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream. java:1646) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java :78) 在 HibernateUtils.main(HibernateUtils.java:48) 错误 java.lang.ClassCastException: 无法将 java.lang.String 的实例分配给 java.lang 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中的.Classbase/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream. java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) 错误 java.lang。 ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClassbase/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream. java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) 错误 java.lang。 ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClassObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) ) 错误 java.lang.ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass。 javassist.SerializableProxyObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) ) 错误 java.lang.ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass。 javassist.SerializableProxypojo.javassist.SerializableProxy.identifierGetterMethodClass 类型为 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中的 java.lang.Classpojo.javassist.SerializableProxy.identifierGetterMethodClass 类型为 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中的 java.lang.Class
我可以看到 SerializableProxy 类已从休眠 3 更改为休眠 5。有人可以建议我们现在如何进行吗?有没有办法反序列化 blob 并重建对象
解决方案
推荐阅读
- ios - 如何在 Swift 5 中更改导航栏标题的颜色?
- flutter - 如何将 Provider 用于异步数据?(扑)
- laravel - 有没有办法在 Laravel Backpack CRUD 上更改运行时(使用 ajax 等)类型为“表”的字段的值?
- c# - 在 .NET Core 3.1 Web API 单元测试中运行 TestServer 时扩展/自定义 IApplicationBuilder
- c# - 如何在 ASP.Net Core Web API 控制器中从数据库返回关系数据
- laravel - 为什么代客共享不像本地代客那样在请求中添加斜线
- perl - 使用 perl 脚本来填充硬盘驱动器 - 这可以更有效地完成吗?
- java - Java new Integer() 被阻塞
- java - 我不明白为什么我的一个客户端程序不能向服务器发送多于一条消息?
- algorithm - 这段包含四个递归调用的代码的运行时复杂度是多少?