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.
Вам не нужно откатываться. Операция «сохранить» не создает первый узел. –
Я тестировал его снова, первый узел получил, а второй - нет. Одним исключением для исправления является «PathNotFoundException» для «child», поскольку родительский путь отсутствует до тех пор, пока «somenode/second» не будет присутствовать. Ну, но мое намерение - любая ошибка при создании узла, должна отменить все изменения. – Dileepa
Это не должно произойти. Как вы проверили, что первый узел был сохранен? –