У меня есть класс с именем 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 - это поле схемы.
Пожалуйста, уточните мой обновленный вопрос (после вашего совета) –
Не могли бы вы попробовать с моим кодом в новой базе данных, чтобы убедиться, что он правильно создает? –
Я пробую ваш фрагмент кода. Я обновил свой вопрос. –