我有一个名为CalculationFunctionGroup
的类,我有一个这样的属性:
List<CalculationFunction> functions;
在我的OrientDB上我有一个名为CalculationFunctionGroup
的表,其中一个属性functions
被定义为EMBEDDEDLIST并链接了类CalculationFunction
。
当我尝试保存CalculationFunctionGroup类型的对象时,会引发异常。
例外告诉我:
字段&#39;功能&#39;已被声明为EMBEDDEDLIST与链接类&#39; CalculationFunction&#39;但记录没有上课。
我尝试在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
。
使用的Orient版本是2.2.0
编辑#1
我在Alessandro Rota回答后尝试这个,但错误是一样的:
ODocument myEntity = new ODocument("CalculationFunctionGroup");
myEntity.field("referenceItem", object.getReferenceItem().getData());
db.save(myEntity);
db.commit();
在这段代码中,我改变了我的objct的性质(原始的是一个典型的对象,如CalculationFunctionGroup,现在是一个ODocument)。但错误是一样的。
我已经完成了另一次尝试,ODocument myEntity
没有附加函数(CalculationFunction列表),但错误也引发了
编辑#2
我尝试使用Alessandro Rota的代码片段并且工作正常。
但是当我在CalculationFunction的字段中添加一个链接字段时,我发现了同样的错误!为什么呢?
如果我用object.getRawField(&#34; @ rid&#34;)添加一个链接字段而不是object.getData(),它也能正常工作。
我不明白因为提出错误信息,以及当我仅使用@rid字段而不是完整对象时出现不同行为的原因
编辑#3 最新消息:
这是我的测试场景:
我有这张桌子:
具有这些属性的计算函数(schemafull):
referenceItem LINK 函数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是无模式字段。
答案 0 :(得分:1)
您可以使用此代码
ODocument cf1= new ODocument("CalculationFunction");
cf1.field("name","Function 1",OType.STRING);
ODocument cf2= new ODocument("CalculationFunction");
cf2.field("name","Function 2",OType.STRING);
List<ODocument> list=new ArrayList<ODocument>();
list.add(cf1);
list.add(cf2);
ODocument p = new ODocument("CalculationFunctionGroup");
p.field("functions", list, OType.EMBEDDEDLIST);
p.save();
修改2
如果您想添加链接,可以使用此代码
ODocument cf1= new ODocument("CalculationFunction");
cf1.field("name","Function 1",OType.STRING);
ODocument p = new ODocument("CalculationFunctionGroup");
p.field("mylink", cf1, OType.LINK);
p.save();
编辑3
我创建了schemafull属性mylink2
我已使用此代码
ODocument cf1= new ODocument("CalculationFunction");
cf1.field("name","Function 1",OType.STRING);
cf1.save();
ODocument p = new ODocument("CalculationFunctionGroup");
p.field("mylink", cf1.getIdentity(), OType.LINK);
p.field("mylink2", cf1.getIdentity(), OType.LINK);
p.save();
我得到了
希望它有所帮助。