OrientDb как не обновлять ссылки при использовании объектной базы данных

Здравствуйте, у меня есть база данных объектов в OrientDb, в настоящее время я открываю и закрываю свои подключения к базе данных после получения необходимых мне данных, по этой причине я использую fetchplan *:-1 и отсоединяю свои pojos, используя .detachAll(entity, true ).

Например:

public <T extends NamedEntity> List<T> findAll(Class<T> entityClass) {
    db= pool.acquire(connectionString, user, password);
            db.getEntityManager().registerEntityClasses("com.mypackage");
    List<T> l= new ArrayList<T>();
    OObjectIteratorClass<T> it= db.browseClass(entityClass);
    if (it == null)
        throw new RuntimeException("entityClass " + entityClass.getName() + "not browseable by OrientDb");
    it.setFetchPlan("*:-1");
    for (T entity : it) {
        l.add((T) db.detachAll(entity, true));
    }
    db.close();
    return l;
}

Проблема в том, что когда я пытаюсь .save() этих парней вернуться в базу данных, я получаю конфликт версий, если два объекта имеют ссылки на третий объект. Это происходит потому, что когда я сохраняю первую, ссылка также сохраняется из-за вызова detachAll, поэтому, когда я сохраняю вторую сущность, ссылка также будет сохранена снова, но эта вторая ссылка на сущность находится в версии на один ниже текущей ( хотя ссылку я вообще не трогал.)

Как это:

List<MyClass> l= findAll(MyClass.class);
//assuming the list contains two elements
MyClass my1= l.get(0);
my1.setLink(myLinkedClass);
MyClass my2= l.get(1);
my2.setLink(myLinkedClass);
db.save(my1);
db.save(my2);

Итак, я спрашиваю, есть ли способ сохранить pojo без сохранения ссылок? Любой специальный вызов метода, который я могу использовать, чтобы сказать OrientDb: «Эй, не смотрите в ссылки при сохранении этого pojo, смотрите только на их RID»?


person Hoffmann    schedule 21.07.2014    source источник


Ответы (1)


Вы можете сначала сохранить связанные объекты, а затем основной объект. Таким образом, OrientDB обнаружит, что объект не загрязнен, и пропустит каскадное сохранение.

person Lvca    schedule 21.07.2014
comment
Это будет работать в моем простом примере, но не будет работать в большинстве других случаев, которые у меня есть (например, когда я загружаю некоторые объекты и устанавливаю поле без ссылки во всех из них). На самом деле я хочу, чтобы вообще не приходилось обрабатывать ссылки. - person Hoffmann; 22.07.2014
comment
Также я думаю, что нашел ошибку, OObjectLazySet.contains(null) или OBjectLazySet.remove(null) дают исключение нулевого указателя (кажется, OrientDb пытается сериализовать нули). Поскольку они реализуют Set, вызовы этих методов должны работать. - person Hoffmann; 22.07.2014