Aem JCR/Jackrabbit中是否支持事务?

Aem JCR/Jackrabbit中是否支持事务?,aem,jcr,jackrabbit,Aem,Jcr,Jackrabbit,在以下情况下 Session s = getJcrSessionWithSimpleCredentials(); Node parent = getSomeNode(s).; parent.addNode("firstChild","nt:unstructured"); parent.addNode("second/child","nt:unstructured"); s.save(); 第一个子节点将被保存,但第二个子节点将抛出RepositoryExcepion,因为节点名称中有斜杠“/”

在以下情况下

Session s = getJcrSessionWithSimpleCredentials();
Node parent = getSomeNode(s).;
parent.addNode("firstChild","nt:unstructured");
parent.addNode("second/child","nt:unstructured");
s.save();
第一个子节点将被保存,但第二个子节点将抛出
RepositoryExcepion
,因为节点名称中有斜杠“/”。 现在我想回滚创建这两个节点的更改

如何在JCR/Jacrabbit中处理此问题

Session s = getJcrSessionWithSimpleCredentials();
Node parent = getSomeNode(s).;
parent.addNode("firstChild","nt:unstructured");
parent.addNode("second/child","nt:unstructured");
s.save();
如您所说,如果行
parent.addNode(“second/child”,“nt:unstructured”)
抛出异常,
s.save()
不会执行(该行永远不会到达),其他人将看不到您对存储库所做的更改

但是,在您的会话中,
firstChild
的添加仍然是可见的

您可以刷新会话以放弃对会话的本地更改。举个简单的例子:

try {
    Session s = getJcrSessionWithSimpleCredentials();
    Node parent = getSomeNode(s).;
    parent.addNode("firstChild","nt:unstructured");
    parent.addNode("second/child","nt:unstructured");
    s.save();
} catch (PathNotFoundException ex) {
    // log the exception
    // give up all unsaved changes made in your session
    s.refresh(false); 
}
请注意,这只是一个简明的例子。就我个人而言,在尝试保存节点之前,我会检查父节点是否存在,而不是捕获
PathNotFoundException
。关键是,当您想要放弃未保存的更改时,可以执行会话刷新。无论是在catch块中还是在条件表达式的分支中

引用

如果
keepChanges
为false,此方法将丢弃当前在此
会话中记录的所有挂起更改,并返回所有项目以反映当前保存的状态。在事务外部,此状态只是持久存储的当前状态。在事务中,此状态将反映已保存但尚未提交的更改所修改的持久存储


至于事务支持,您可以阅读更多内容。

无需回滚任何内容。“保存”操作没有创建第一个节点。我再次测试了它,第一个节点被保存,但第二个节点没有。一个更正异常是“child”的“PathNotFoundException”,因为父路径丢失,直到“somenode/second”不存在。好吧,但我的意图是创建节点时的任何错误都应该回滚所有更改。这是不应该发生的。如何测试第一个节点是否已保存?