Java ApacheIgnite-如何演化带注释类的模式/属性

Java ApacheIgnite-如何演化带注释类的模式/属性,java,ignite,Java,Ignite,我正在使用ApacheIgnite和类注释,如中所述 我们应该如何处理类的变化?例如,如果从应用程序的v1和v2添加新属性,会发生什么情况? 以前的值是否反序列化?我可以指定默认值吗 我找不到有关此主题的任何文档。我尝试了一个简单的用例,似乎新属性是空的。我该怎么办 更新 根据@dmagda的建议,我尝试在我的类中添加属性,使用altertable MYTABLE add COLUMN myNewProperty varchar将其添加到表中然后使用updatemytable SET myNew

我正在使用ApacheIgnite和类注释,如中所述

我们应该如何处理类的变化?例如,如果从应用程序的v1和v2添加新属性,会发生什么情况? 以前的值是否反序列化?我可以指定默认值吗

我找不到有关此主题的任何文档。我尝试了一个简单的用例,似乎新属性是空的。我该怎么办

更新 根据@dmagda的建议,我尝试在我的类中添加属性,使用
altertable MYTABLE add COLUMN myNewProperty varchar将其添加到表中
然后使用
updatemytable SET myNewProperty='myDefaultValue'
更改其值
但不幸的是,运行abode
UPDATE
时出现异常:
错误:class org.apache.ignite.binary.BinaryObjectException:无法使用优化的封送器(state=50000,code=0)解组对象

可以通过使用SQL更改新字段来更新现有记录?怎么做

更新2 解决了我的问题。这是因为我的类是用scala编写的,带有一些特定于scala的类型('Map',…)。我的应用程序使用客户端模式连接到Ignite,因此当从
sqlline
实用程序执行更新时,Ignite无法反序列化类型。
现在我将我的类切换为普通POJO,现在我可以更新模式和更新数据。

只需通过添加一个新字段来更新Java类,它将被存储并可以无任何问题地读回。您可能会将null视为新字段的值,原因有两个:

  • 应用程序未将其设置为任何特定值
  • 您正在从Ignite读取一个旧对象,该对象在您更新类之前存储,因此,新字段没有出现在那里

如果需要使用SQL访问新字段,请使用ALTER TABLE命令将该字段添加到SQL架构。

谢谢@dmagda。那么值类型呢?例如,
Int
属性在Ignite内部不存在时将具有0值?thanks@DavideIcardi,是的,它将是该类型的默认值(
null
或0)。@dmagda非常感谢您的建议。是否可以将新字段的默认值从
0/null
更改?我尝试使用
altertable
添加列,并使用
UPDATE
更新字段。但我得到了一个错误:
error:class org.apache.ignite.binary.BinaryObjectException:未能使用优化的封送器(state=50000,code=0)解组对象
。我已经用这些信息更新了这些问题……除了@dmagda的答案外,请参阅这篇文章,其中解释了对象的存储方式以及限制和数据模型的更改。您可以提供整个堆栈跟踪吗?@alamar我使用
sqlline
获得此错误,我没有堆栈跟踪。这里是完整的输出:
0:jdbc:ignite:thin://127.0.0.1/>更新“设备”。DeviceTo设置TENANTID='updated tenant',其中DEVICEID='device-00';错误:class org.apache.ignite.binary.BinaryObjectException:无法使用优化封送器(state=50000,code=0)解组对象。
@DavideIcardi您应该查看服务器节点的日志以获得完整的堆栈跟踪。@alamar谢谢!查看日志后,我发现问题在于序列化问题。在Ignite服务器上,我没有scala集合类。现在我已经使用了普通的POJO,并且能够正确地从sql更新数据库。谢谢你的建议。