2016-07-20 3 views
0

У меня есть класс с именем CalculationFunctionGroup, где у меня есть атрибут вроде этого:OrientDB - исключение при попытке сохранить embeddedlist

List<CalculationFunction> functions; 

на моем OrientDB У меня есть таблица с именем CalculationFunctionGroup со свойством functions definaed в EMBEDDEDLIST и связанный класс CalculationFunction.

Когда я пытаюсь сохранить объект типа CalculationFunctionGroup, возникает исключение.

Исключение говорит мне:

В поле «функция» была объявлено как EMBEDDEDLIST с связанным классом «CalculationFunction», но запись не имеет класса.

Я пытаюсь найти это исключение в исходном коде 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

EDIT # 1

я попробовать это после того, как Алессандро Rota ответ, но ошибка та же:

ODocument myEntity = new ODocument("CalculationFunctionGroup"); 
myEntity.field("referenceItem", object.getReferenceItem().getData()); 
db.save(myEntity); 
db.commit(); 

В этом фрагменте кода Я изменил характер моего объекта (исходным является типизированный объект как CalculationFunctionGroup и теперь является ODocument). Но ошибка такая же.

Другая попытка я сделал, то ODocument myEntity не присоединенные функции (список CalculationFunction), но ошибка возникает слишком

EDIT # 2

Я попытался с фрагмент кода Алессандро Рота и прекрасно работает.

Но когда я добавляю в поле CalculationFunction поле ссылки, у меня такая же ошибка! Зачем?

Если я добавляю поле ссылки вместо object.getData() с object.getRawField ("@ rid"), он отлично работает.

Я не понимаю, потому что возникает это сообщение об ошибке, и причиной различного поведения, когда я использую только @rid поле вместо законченным объектом

EDIT # 3 Последние новости:

Это мой тестовый сценарий:

у меня есть эта таблица:

CalculationFunction с этим свойством (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

Вы можете использовать этот код

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

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

EDIT 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

Надеется, что это помогает.

+0

Пожалуйста, уточните мой обновленный вопрос (после вашего совета) –

+0

Не могли бы вы попробовать с моим кодом в новой базе данных, чтобы убедиться, что он правильно создает? –

+0

Я пробую ваш фрагмент кода. Я обновил свой вопрос. –

Смежные вопросы