orientdb属性约束,如强制不在不正确的java api插入上失败
我有一个orientdb设置,其中有一个名为MessageLog的类,其属性messageId具有约束MANADATORY且不为NULL。如果我试图从控制台插入一个带有null messageId的记录,它会引发一个异常,告诉我属性不能为null。但是,当我从JavaAPI进行简单插入时,插入的记录的属性值为null。这怎么可能呢 java代码是:orientdb属性约束,如强制不在不正确的java api插入上失败,java,graph,orientdb,Java,Graph,Orientdb,我有一个orientdb设置,其中有一个名为MessageLog的类,其属性messageId具有约束MANADATORY且不为NULL。如果我试图从控制台插入一个带有null messageId的记录,它会引发一个异常,告诉我属性不能为null。但是,当我从JavaAPI进行简单插入时,插入的记录的属性值为null。这怎么可能呢 java代码是: import com.tinkerpop.blueprints.Vertex; import com.tinkerpop.blueprints.im
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.");
}
}
有人能解释一下吗。来自
每次修改图形时,如果没有运行以前的事务,则会自动启动隐式事务。通过调用shutdown()方法或显式提交()关闭图形时,事务将自动提交。要回滚更改,请调用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()处理异常,所以顶点不会出现在图中
有趣的是,仅仅拥有强制属性似乎还不够,也就是说,如果您从未在一开始就用null填充字段,那么它将允许提交,而不会引发异常。我还没有研究过它,但它可能与图形实例在默认情况下是混合模式或类似的东西有关?我希望其他人知道。谢谢你的回答!:)@用户3390629