Ограничения свойств orientdb, такие как ОБЯЗАТЕЛЬНО, не срабатывают при неправильной вставке java api

У меня есть настройка orientdb с классом MessageLog со свойством messageId, имеющим ограничение MANADATORY и NOT NULL. Если я пытаюсь вставить запись из консоли с нулевым messageId, возникает исключение, сообщающее, что свойство не может быть нулевым. Но когда я делаю простую вставку из Java API, запись вставляется со значением свойства null. Как такое возможно.

Код Java:

import com.tinkerpop.blueprints.Vertex;
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
import com.tinkerpop.blueprints.impls.orient.OrientVertexType;

public class OrientDbTrials {

public static void main(String[] args) {

    OrientGraph graph = new OrientGraph("remote:localhost/blah","root","*****");
    System.out.println("Connected to the db.");

    Vertex messageLog = graph.addVertex("class:MessageLog");

    System.out.println("Created new vertex : " + messageLog.toString());
    messageLog.setProperty("messageId", null);
    graph.commit();
    System.out.println("Successfully saved it.");

    }

}

Может кто-нибудь объяснить это.


person Karthik Srivatsa    schedule 27.02.2015    source источник


Ответы (1)


Из http://www.orientechnologies.com/docs/1.7.8/orientdb.wiki/Graph-Database-Tinkerpop.html

Каждый раз, когда граф изменяется, автоматически запускается неявная транзакция, если предыдущая транзакция не выполнялась. Транзакции фиксируются автоматически, когда график закрывается вызовом метода shutdown () или явным commit (). Для отката изменений вызовите метод rollback (). Изменения внутри транзакции будут временными до фиксации или закрытия экземпляра графа. Параллельные потоки или внешние клиенты могут видеть изменения только после полной фиксации транзакции.

Поскольку вы не определяете, как обрабатывать исключения, я думаю, что когда оно поднимается, граф закрывается и, таким образом, фиксирует изменение. Когда я запускаю код, который вы даете в блоке try catch, я получаю исключение.

OrientGraph graph = new OrientGraph("remote:localhost/blah","root","*****");
System.out.println("Connected to the db.");
try { Vertex messageLog = graph.addVertex("class:MessageLog");

      System.out.println("Created new vertex : " + messageLog.toString());
      messageLog.setProperty("messageId", null);
      graph.commit();
} catch(Exception e) {
  graph.rollback();
}
finally {
  graph.shutdown();
}

Этот код (простите за уродство) вызывает это исключение

java.lang.IllegalArgumentException: Property value can not be null

И поскольку я обрабатываю исключение с помощью graph.rollback (), вершина не отображается на графике.

Интересно то, что просто наличия обязательного свойства кажется недостаточно, то есть, если вы никогда не заполняете поле нулевым значением, это разрешит фиксацию, а не вызовет исключение. Я не изучал это, но, может быть, это как-то связано с экземпляром графа, который по умолчанию является смешанной схемой или чем-то в этом роде? Надеюсь, кто-то еще знает.

person user3390629    schedule 27.02.2015
comment
Спасибо, что ответили! :) @ user3390629 - person Karthik Srivatsa; 02.03.2015