Jcr 删除时未在Jackrabbit中找到复制节点的节点标识符

Jcr 删除时未在Jackrabbit中找到复制节点的节点标识符,jcr,jackrabbit,dms,jcr-sql2,Jcr,Jackrabbit,Dms,Jcr Sql2,我使用session.getWorkspace().copy(sourceNode.getPath(),destinationNode.getPath())在Jackrabbit中复制了一个节点。 据我所知,此操作更改会立即保留。但是,当我试图使用session.getNodeByIdentifier(“复制节点的nodeId”)获取复制的节点以删除它时,它给出了ItemNotFoundException。该错误的原因是复制过程中复制的节点丢失了ismix:referenceable属性,这导致

我使用
session.getWorkspace().copy(sourceNode.getPath(),destinationNode.getPath())在Jackrabbit中复制了一个节点。

据我所知,此操作更改会立即保留。但是,当我试图使用
session.getNodeByIdentifier(“复制节点的nodeId”)
获取复制的节点以删除它时,它给出了ItemNotFoundException。该错误的原因是复制过程中复制的节点丢失了is
mix:referenceable
属性,这导致getNodeByIdentifier失败

问题是如何将
mix:referenceable
属性设置为复制的节点,因为复制操作后我无法从会话中获取节点。有人能帮我一下吗

更新:

代码:

    Node srcNode = session.getNodeByIdentifier("SOURCE_NODE_ID");
    if(srcNode == null) {
        System.out.println("File not found");
    }

    Node rootNode = session.getRootNode();
    Node appNode  = rootNode.getNode("JACKRABBIT");
    Node destNode = appNode.addNode("Copy_Test_"+System.currentTimeMillis(),"nt:file");

    session.getWorkspace().copy(srcNode.getPath(),destNode.getPath());
    destNode.addMixin(MIX_VERSIONABLE);
    destNode.addMixin(MIX_LOCKABLE);
    destNode.addMixin(MIX_REFERENCEABLE);
    destNode.addNode(DMSConstants.RESOURCE_NODE,"nt:unstructured");
    session.refresh(true);
    session.save();
例外情况:

    Node srcNode = session.getNodeByIdentifier("SOURCE_NODE_ID");
    if(srcNode == null) {
        System.out.println("File not found");
    }

    Node rootNode = session.getRootNode();
    Node appNode  = rootNode.getNode("JACKRABBIT");
    Node destNode = appNode.addNode("Copy_Test_"+System.currentTimeMillis(),"nt:file");

    session.getWorkspace().copy(srcNode.getPath(),destNode.getPath());
    destNode.addMixin(MIX_VERSIONABLE);
    destNode.addMixin(MIX_LOCKABLE);
    destNode.addMixin(MIX_REFERENCEABLE);
    destNode.addNode(DMSConstants.RESOURCE_NODE,"nt:unstructured");
    session.refresh(true);
    session.save();
线程“main”javax.jcr.InvalidItemStateException中出现异常:无法更新过时的项:item.save() 位于org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:111) 位于org.apache.jackrabbit.rmi.server.ServerSession.save(ServerSession.java:265) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 位于java.lang.reflect.Method.invoke(Method.java:498) 在sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346) 在sun.rmi.transport.transport$1.run(transport.java:200) 在sun.rmi.transport.transport$1.run(transport.java:197) 位于java.security.AccessController.doPrivileged(本机方法) 位于sun.rmi.transport.transport.serviceCall(transport.java:196) 位于sun.rmi.transport.tcp.tcpttransport.handleMessages(tcpttransport.java:568) 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run0(tcpttransport.java:826) 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.lambda$run$0(tcpttransport.java:683) 位于java.security.AccessController.doPrivileged(本机方法) 位于sun.rmi.transport.tcp.tcpttransport$ConnectionHandler.run(tcpttransport.java:682) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 运行(Thread.java:748) 位于sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276) 位于sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253) 位于sun.rmi.server.UnicastRef.invoke(UnicastRef.java:162) 位于org.apache.jackrabbit.rmi.server.ServerXASession_Stub.save(未知源) 位于org.apache.jackrabbit.rmi.client.ClientSession.save(ClientSession.java:272)


请注意,如果我将代码更改为
会话。刷新(false)
,我也在使用JCR 2.0,代码工作正常,但我无法从会话中找到节点标识符以删除相同的节点标识符,这是我的原始问题。

为什么要在目标位置创建节点,然后复制到相同的位置?我认为陈旧异常是因为对
copy
的调用更新了基础节点,使您的
destNode
引用陈旧/过时

只需删除
addNode
,然后执行以下操作

String destPath = "Copy_Test_" + System.currentTimeMillis()";
session.getWorkspace().copy(srcNode.getPath(), destPath);
Node destNode = session.getPath(destPath);

正如@TedTrippin指出的,问题在于在复制之前创建一个目标节点,这是不需要的。作为复制的一部分,将创建节点。因此,我的最终工作代码如下:

Node srcNode = session.getNodeByIdentifier("SOURCE_NODE_ID");
if(srcNode == null) {
    System.out.println("File not found");
}

Node rootNode = session.getRootNode();
Node appNode  = rootNode.getNode("JACKRABBIT");    
String destNodeName = "Copy_Test";  
session.getWorkspace().copy(srcNode.getPath(),appNode.getPath() + "/" + destNodeName);
Node destNode = appNode.getNode(destNodeName);
destNode.addMixin(MIX_VERSIONABLE);
destNode.addMixin(MIX_LOCKABLE);
destNode.addMixin(MIX_REFERENCEABLE);    
session.refresh(true);
session.save();

我很久以前就把它撞坏了。谢谢你的回答。