Я хочу удалить и вставить тройки из репозитория сезама с помощью запросов SPARQL, и я хочу выполнить обе операции как одну транзакцию.
- УДАЛИТЬ
- ВСТАВЛЯТЬ
Если во время транзакции возникает исключение, выполняется откат ... но похоже, что это не работает. Проблема в том, что если во время запроса вставки возникает исключение, выполняется откат, но ранее удаленные тройки не восстанавливаются (почему?).
Вот код:
У меня есть класс OwlimConnector, который обертывает соединение с репозиторием и предоставляет некоторые методы для выполнения запросов SPARQL. В конструкторе этого класса я установил соединение и установил для autocommit значение false:
RemoteRepositoryManager repos_manager = RemoteRepositoryManager.getInstance(SERVER_URL, USER, PASSWORD);
repos_manager.initialize();
Repository ssr = repos_manager.getRepository(REPOSITORY);
rconn = ssr.getConnection();
rconn.setAutoCommit(false);
В OwlimConnector есть метод executeUpdate:
public void executeUpdate(String queryString) throws RepositoryException, MalformedQueryException, UpdateExecutionException
{
Update up = rconn.prepareUpdate(QueryLanguage.SPARQL, queryPrefixString + queryString);
up.execute();
}
и эти методы среди других:
public void commit(){
rconn.commit();
}
public void rollback() {
rconn.rollback();
}
public void close(){
rconn.close();
}
С другой стороны, у меня есть веб-служба updateUserGroup, которая использует предыдущий OwlimConnector и объект доступа к данным под названием UserGroupDAO:
@PUT
@Consumes(MediaType.APPLICATION_XML)
public Response updateUserGroup(UserGroup ug) {
try {
oc = new OwlimConnector();
} catch (OwlimInstantiationException e) {
return ResponseFactory.getError(e.getErrorMessage());
}
try {
UserGroupDAO ugdao = new UserGroupDAO(oc);
ugdao.delete(ug.getUri());
ugdao.add(ug);
oc.commit();
oc.close();
return ResponseFactory.getOK();
} catch (MandatoryFieldException e) {
oc.rollback();
oc.close();
return ResponseFactory.getError(e.getErrorMessage());
} catch (NotExistingResourceException e) {
oc.rollback();
oc.close();
return ResponseFactory.getError(e.getErrorMessage());
} catch (Exception e) {
oc.rollback();
oc.close();
return ResponseFactory.getError(new GenericException(e).getErrorMessage());
}
}
1 Что делает ugdao.delete (ug.getUri ()), так это вызов метода OwlimConnector executeUpdate:
oc.executeUpdate("DELETE { " + usergroup + " ?p ?v . } WHERE { " + usergroup + " ?p ?v . }");
Здесь тройки удаляются, хотя фиксации нет!
2 Что делает ugdao.add (ug):
Чтобы проверить, что ug.getName () не является нулем или пробелами, в противном случае создается исключение MandatoryFieldException:
if (ug.getName() == null || ug.getName().equals("")){
throw new MandatoryFieldException("name");
}
Затем данные вставляются:
oc.executeUpdate("INSERT DATA { " + ug.getUri() + " a scmu:UserGroup ; scmu:hasName \"" + ug.getName() + "\" . }");
Когда ug.getName () имеет значение null или пробелы, генерируется исключение MandatoryFieldException и перехватывается updateUserGroup. Затем выполняется откат, но удаленные тройки не восстанавливаются.
Не знаю, почему это происходит. Любая идея?
заранее большое спасибо