0

我有一个名为的类CalculationFunctionGroup,其中我有一个这样的属性:

List<CalculationFunction> functions;

在我的 OrientDB 上,我有一个名为EMBEDDEDLIST 和链接类CalculationFunctionGroup的属性的表。functionsCalculationFunction

当我尝试保存 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实例在哪里,fieldNamefunctions,价值是我ListCalculationFunctionOTypeEMBEDDEDLIST

使用的东方版本是 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 是一个无模式字段。

4

1 回答 1

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

我得到了

在此处输入图像描述

希望能帮助到你。

于 2016-07-20T08:24:55.983 回答