SPARQL 쿼리를 사용하여 참깨 저장소에서 트리플을 삭제하고 삽입하고 싶습니다. 두 작업을 모두 단일 트랜잭션으로 실행하려고합니다. 예외가 트랜잭션 중에 발생하는 경우저장소 연결 - SPARQL 쿼리를 사용하여 롤백이 작동하지 않습니까?
- INSERT
삭제, 롤백이 실행 ... 그러나 작동하지 않을 것입니다. 삽입 쿼리 중에 예외가 발생하면 롤백이 실행되지만 이전에 삭제 된 트리플은 복구되지 않습니다 (이유는 무엇입니까?). 내가 저장소 연결을 래핑하고 SPARQL 쿼리를 만들기 위해 몇 가지 방법을 제공 OwlimConnector라는 클래스가
:
여기에 몇 가지 코드가 있습니다. 이 클래스의 생성자에서 , 나는 연결을 설정하고 나는 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 및 데이터 액세스 개체라는 사용자를 사용하여이 GroupDAO :
oc.executeUpdate("DELETE { " + usergroup + " ?p ?v . } WHERE { " + usergroup + " ?p ?v . }");
다음
트리플 더가 투입 되더라도 삭제되지 않습니다 :
@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의 호출하는 것입니다!
2 어떤 ugdao.add은 (UG)을 수행하는 단계이다
가 ug.getName()는 널 (NULL) 또는 공백이 아니라는 것을 확인하기 위해, 달리 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에 걸려있다. 그런 다음 롤백이 실행되지만 삭제 된 트리플은 복구되지 않습니다.왜 이렇게되는지 모르겠습니다. 어떤 아이디어?
대단히 감사합니다.
이것은 매우 독특한 OWLIM 특정 문제/버그처럼 들리지만, 나는 그들의 메일 링리스트 - http : // www .ontotext.com/owlim/mailing-lists – RobV
좋아, 나는 거기에서 물어볼 것이다. 내가 힌트를 얻으면 알려주지. – jegarna