我有一个名为的类CalculationFunctionGroup
,其中我有一个这样的属性:
List<CalculationFunction> functions;
在我的 OrientDB 上,我有一个名为EMBEDDEDLIST 和链接类CalculationFunctionGroup
的属性的表。functions
CalculationFunction
当我尝试保存 CalculationFunctionGroup 类型的对象时,会引发异常。
异常告诉我:
字段“函数”已声明为带有链接类“CalculationFunction”的 EMBEDDEDLIST,但记录没有类。
我尝试在 OrientDB 源代码中找到这个异常,我发现:
方法中有一个签入ODocument
类,validateEmbedded
其中有这些代码行:
if (doc.getImmutableSchemaClass() == null)
throw new OValidationException("The field '" + p.getFullName() + "' has been declared as " + p.getType()
+ " with linked class '" + embeddedClass + "' but the record has no class");
所以,我不明白如何评估 immutableschemaclass 属性。
在我尝试从 Java 设置字段值的地方,我使用以下命令行:
this.data.field(fieldName, value, OType.EMBEDDEDLIST);
data
我的ODocument
实例在哪里,fieldName
是functions
,价值是我List
的CalculationFunction
,OType
是EMBEDDEDLIST
。
使用的东方版本是 2.2.0
编辑#1
我在 Alessandro Rota 回答后尝试了这个,但错误是一样的:
ODocument myEntity = new ODocument("CalculationFunctionGroup");
myEntity.field("referenceItem", object.getReferenceItem().getData());
db.save(myEntity);
db.commit();
在此代码片段中,我更改了对象的性质(原始对象是 CalculationFunctionGroup 的类型化对象,现在是 ODocument)。但错误是一样的。
我做过的另一次尝试,ODocumentmyEntity
没有附加函数(CalculationFunction 列表),但错误也出现了
编辑#2
我已经尝试过使用 Alessandro Rota 的代码片段并且工作正常。
但是,当我将链接字段添加为 CalculationFunction 字段时,我遇到了同样的错误!为什么?
如果我使用 object.getRawField("@rid") 添加链接字段而不是 object.getData() 它也可以正常工作。
我不明白,因为会引发该错误消息,以及当我仅使用 @rid 字段而不是完整对象时出现不同行为的原因
编辑#3 最新消息:
这是我的测试场景:
我有这张桌子:
具有这些属性的 CalculationFunction (schemafull):
referenceItem 链接函数 EMBEDDEDLIST
当我尝试保存时,我编写了以下代码:
ODocument myGroup = new ODocument("CalculationFunctionGroup");
Object rid = null;
if (object.getField("referenceItem") instanceof RegistryMetadata) {
rid = ((RegistryMetadata)(object.getField("referenceItem"))).getRawField("@rid");
} else if (object.getField("referenceItem") instanceof PayrollRegistryMetadata) {
rid = ((PayrollRegistryMetadata)(object.getField("referenceItem"))).getRawField("@rid");
} else if (object.getField("referenceItem") instanceof PreCalculationMetadata) {
rid = ((PreCalculationMetadata)(object.getField("referenceItem"))).getRawField("@rid");
} else if (object.getField("referenceItem") instanceof CalculationMetadata) {
rid = ((CalculationMetadata)(object.getField("referenceItem"))).getRawField("@rid");
}
myGroup.field("referenceItem", rid, OType.LINK);
myGroup.field("scenario", ((Scenario)object.getField("scenario")).getRawField("@rid"));
List<ODocument> lstFunctions = new ArrayList<ODocument>();
if (object.getField("functions") != null) {
Iterable<ODocument> lstFun = (Iterable<ODocument>) object.getField("functions");
Iterator<ODocument> itFun = lstFun.iterator();
while(itFun.hasNext()) {
ODocument currFun = itFun.next();
ODocument oFun = new ODocument("CalculationFunction");
oFun.field("name", currFun.field("name"));
oFun.field("code", currFun.field("code"));
oFun.field("language", currFun.field("language"));
lstFunctions.add(oFun);
}
}
myGroup.field("functions", lstFunctions, OType.EMBEDDEDLIST);
myGroup.save();
db.commit();
这段代码出错了,但是......如果我写这个:
myGroup.field("referenceItem2", rid, OType.LINK);
代码工作正常。
区别:referenceItem 是一个 schemafull 属性,referenceItem2 是一个无模式字段。