2017-01-27 7 views
1

は、JCR/Jackrabbitでの取引はサポートされていますか?以下の場合

Session s = getJcrSessionWithSimpleCredentials(); 
Node parent = getSomeNode(s).; 
parent.addNode("firstChild","nt:unstructured"); 
parent.addNode("second/child","nt:unstructured"); 
s.save(); 

最初の子が保存されますが、ノード名にスラッシュ「/」があるように、第2子は、RepositoryExcepionをスローします。 これで、両方のノードを作成する変更をロールバックしたいと思います。

これはJCR/Jacrabbitでどのように処理できますか?

あなたが言うように、ライン parent.addNode("second/child","nt:unstructured")が例外をスローし、場合
+0

ロールバックする必要はありません。 「保存」操作では、最初のノードは作成されません。 –

+0

私はもう一度それをテストし、最初のノードは保存されますが、2番目のノードは保存されません。 1つの訂正例外は、 "somenode/second"が存在しなくなるまで、親パスが欠落しているため、 "child"の "PathNotFoundException"です。 ノードを作成する際に、すべての変更をロールバックする必要があります。 – Dileepa

+0

それは起こりそうにない。最初のノードが保存されたことをどのようにテストしましたか? –

答えて

1
Session s = getJcrSessionWithSimpleCredentials(); 
Node parent = getSomeNode(s).; 
parent.addNode("firstChild","nt:unstructured"); 
parent.addNode("second/child","nt:unstructured"); 
s.save(); 

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。要は、保存していない変更をあきらめたいときにセッションの更新を実行できます。キャッチブロックや条件式の枝に入れてください。 keepChangesがfalseの場合

Javadoc for Session#refresh(boolean keepChanges)

を引用するには、この方法では、現在このSessionに記録されているすべての保留中の変更を破棄し、現在保存された状態を反映するためにすべての項目を返します。トランザクションの外部では、この状態は単に永続ストレージの現在の状態です。トランザクション内では、この状態は、保存されたがまだコミットされていない変更によって変更された永続ストレージを反映します。

トランザクションサポートについては、hereを読むことができます。

関連する問題