2017-01-27 5 views
1

В следующем случаеЕсть ли поддержка для транзакций в JCR/Jackrabbit?

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

Первый ребенок будет сохранен, но второй ребенок бросит RepositoryExcepion, так как есть слэш «/» в имени узла. Теперь я хочу отменить мои изменения в создании обоих узлов.

Как это можно обрабатывать в JCR/Jacrabbit?

+0

Вам не нужно откатываться. Операция «сохранить» не создает первый узел. –

+0

Я тестировал его снова, первый узел получил, а второй - нет. Одним исключением для исправления является «PathNotFoundException» для «child», поскольку родительский путь отсутствует до тех пор, пока «somenode/second» не будет присутствовать. Ну, но мое намерение - любая ошибка при создании узла, должна отменить все изменения. – Dileepa

+0

Это не должно произойти. Как вы проверили, что первый узел был сохранен? –

ответ

1
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 или ветви условного выражения.

процитировать Javadoc for Session#refresh(boolean keepChanges)

Если keepChanges ложно, этот метод отбрасывает все ожидающие изменения в настоящее время, записанные в этом Session и возвращает все элементы, чтобы отразить текущее сохраненное состояние. За пределами транзакции это состояние является просто текущим состоянием постоянного хранения. Внутри транзакции это состояние будет отображать постоянное хранилище, измененное изменениями, которые были сохранены, но еще не выполнены.

Что касается поддержки транзакций, вы можете прочитать больше here.

Смежные вопросы