OrientDB - 我尝试保存嵌入式列表时出现异常

时间:2016-07-20 07:33:54

标签: orientdb orientdb2.2 embeddedlist

我有一个名为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个实例,fieldNamefunctions,值是List CalculationFunctionOTypeEMBEDDEDLIST

使用的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是无模式字段。

1 个答案:

答案 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();

enter image description here

修改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

enter image description here

我已使用此代码

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();

我得到了

enter image description here

希望它有所帮助。