删除

时间:2017-09-16 12:35:47

标签: jcr jackrabbit dms jcr-sql2

我使用session.getWorkspace().copy(sourceNode.getPath(), destinationNode.getPath())

在Jackrabbit中复制了一个节点

据我所知,此操作更改会立即保留。但是当我尝试使用session.getNodeByIdentifier("nodeId of copied node")获取复制的节点以将其删除时,它会给出ItemNotFoundException。出现该错误的原因是复制的节点在复制期间失去了mix:referenceable属性,导致getNodeByIdentifier失败。

问题是我如何将mix:referenceable属性设置为复制节点,因为我无法在复制操作后从会话中获取节点。有人可以帮我解决这个问题吗?

更新:

CODE:

    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()       at org.apache.jackrabbit.rmi.server.ServerObject.getRepositoryException(ServerObject.java:111)       在org.apache.jackrabbit.rmi.server.ServerSession.save(ServerSession.java:265)       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       at java.lang.reflect.Method.invoke(Method.java:498)       at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)       at sun.rmi.transport.Transport $ 1.run(Transport.java:200)       at sun.rmi.transport.Transport $ 1.run(Transport.java:197)       at java.security.AccessController.doPrivileged(Native Method)       at sun.rmi.transport.Transport.serviceCall(Transport.java:196)       at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)       at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.java:826)       at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.lambda $ run $ 0(TCPTransport.java:683)       at java.security.AccessController.doPrivileged(Native Method)       at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:682)       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)       在java.lang.Thread.run(Thread.java:748)       at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)       at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)       at 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)

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

2 个答案:

答案 0 :(得分:1)

为什么要在目的地创建节点然后复制到同一个地方?我认为陈旧的例外是因为对copy的调用已更新了基础节点,使您的destNode参考陈旧/过时。

只需删除addNode,然后执行类似......

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

答案 1 :(得分:0)

正如@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();