【发布时间】:2018-09-21 22:34:07
【问题描述】:
我正在使用带有类注释的 Apache Ignite,如 "Query Configuration by Annotations" 中所述。
我们应该如何处理类变化?例如,如果我从我的应用程序的 v1 和 v2 添加一个新属性会发生什么? 以前的值是否反序列化?我可以指定一个默认值吗?
我找不到有关此主题的任何文档。我尝试了一个简单的用例,似乎新属性为空。我该如何处理?
更新
根据@dmagda 的建议,我尝试在我的类上添加一个属性,使用ALTER TABLE MYTABLE ADD COLUMN myNewProperty varchar; 将其添加到表中,然后使用UPDATE MYTABLE SET myNewProperty='myDefaultValue' 更改它的值。
但不幸的是运行住所UPDATE 我得到了例外:Error: class org.apache.ignite.binary.BinaryObjectException: Failed to unmarshal object with optimized marshaller (state=50000,code=0)
是否可以通过使用 SQL 更改新字段来更新现有记录?怎么样?
更新 2
解决了我的问题。这是因为我的课程是用 scala 编写的,具有一些 scala 特定类型('Map',...)。我的应用程序使用客户端模式连接到 Ignite,因此当从 sqlline 实用程序执行 UPDATE 时,Ignite 无法反序列化类型。
现在我将我的课程切换为普通 POJO,现在我可以更新架构和更新数据了。
【问题讨论】:
-
除了@dmagda 的回答,请参阅this doc,其中解释了对象的存储方式以及限制和数据模型的变化。
-
你能提供整个堆栈跟踪吗?
-
@alamar 我使用
sqlline收到此错误,我没有堆栈跟踪。这里是完整的输出:0: jdbc:ignite:thin://127.0.0.1/> UPDATE "devices".DEVICEDTO SET TENANTID = 'updated-tenant' WHERE DEVICEID = 'device-00'; Error: class org.apache.ignite.binary.BinaryObjectException: Failed to unmarshal object with optimized marshaller (state=50000,code=0) -
@DavideIcardi 您应该查看服务器节点的日志以获取完整的堆栈跟踪。
-
@alamar 谢谢!查看日志,我发现问题是序列化问题。在 Ignite 服务器上,我没有 scala 集合类。现在我使用了普通的 POJO,并且能够正确地从 sql 更新我的数据库。感谢您的建议。