Нарушение уникального ограничения SDN4

#java #neo4j #spring-data-neo4j-4

#java #neo4j #spring-data-neo4j-4

Вопрос:

Я использую SDN 4.1.2 и neo4j-org 2.0.4 с http-драйвером, когда на одном из узлов нарушается уникальное ограничение, и я нахожусь в транзакции, меня TransactionException выбрасывают в логи, которые я вижу

org.neo4j.ogm.exception.Исключение CypherException: ошибка при выполнении Cypher «Neo.ClientError.Схема.Сбой проверки ограничений»; Код: Neo.Ошибка доступа.Схема.Ошибка проверки ограничений; Описание: Узел 441 уже существует с меткой City и свойством «name»=[Джамму]

Но если я попытаюсь перехватить TransactionException , я не увижу никакой информации о нарушении ограничения. Я хотел бы вернуть информацию о нарушении ограничений в моем ответе службы.

Должен ли я явно выполнять проверку уникальности в моем классе обслуживания вместо того, чтобы полагаться на ограничение уникальности в базе данных?


Класс обслуживания

 @Transactional
public void createCity(City city) {
    try {
        cityRepository.save(city);
    }
    catch(Exception e) {
        System.out.println("***********************Inside Service *********************************");
        e.printStackTrace();
        throw e;
    }
}
  

Тестовый класс

     public void testCreateDuplicateCity2() {
    try {
        City city = new City();
        city.setName("Jammu");
        city.setZip("345678");
        service.createCity();
    }
    catch(Exception e){
        System.out.println("######################### Inside test ############################");
        e.printStackTrace();
    }
}
  

Трассировки стека

 *********************** Внутренняя служба ********************************* org.neo4j.ogm.exception.Исключение CypherException: ошибка при выполнении Cypher "Neo.ClientError.Схема.Сбой проверки ограничений"; Код: Neo.Ошибка доступа.Схема.Ошибка проверки ограничений; Описание: Узел 457 уже существует с меткой City и свойством "name"=[Jammu] в org.neo4j.ogm.drivers.http.response.Абстрактныйhttpresponse.initialize(абстрактныйhttpresponse.java:83) в org.neo4j.ogm.drivers.http.response.Абстрактныйhttpresponse.(Аннотация HttpResponse.java:74) в org.neo4j.ogm.drivers.http.response.RowModelResponse.(RowModelResponse.java:31) в org.neo4j.ogm.drivers.http.request.HttpRequest.execute(HttpRequest.java:123) в org.neo4j.ogm.session.request.RequestExecutor.executeSave(RequestExecutor.java:120) в org.neo4j.ogm.session.делегирует.Сохраненный файл.save(SaveDelegate.java:75) в org.neo4j.ogm.session.делегирует.SaveDelegate.save(SaveDelegate.java:44)

     ######################### Inside test ############################
  

org.neo4j.ogm.exception.Исключение TransactionException: не удалось выполнить запрос:
в org.neo4j.ogm.drivers.http.transaction.HttpTransaction.rollback(HttpTransaction.java:49)
в org.springframework.data.neo4j.transaction.Neo4jTransactionManager.откат(Neo4jTransactionManager.java:60)
в org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:501)
в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:284)
в org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
в org.springframework.aop.framework.ReflectiveMethodInvocation.продолжить (ReflectiveMethodInvocation.java:179)
в org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
в com.platform.entity.demo.service.CityStateService$$EnhancerBySpringCGLIB$$43ef26b7.createDuplicateCity2()
в com.platform.entity.demo.repository.test.UniqueIndexTest.testCreateDuplicateCity2(UniqueIndexTest.java:74)

Если у меня есть обработка исключений в методе, вызывающем службу, то информация о нарушении ограничения теряется.

Комментарии:

1. Не уверен, что происходит. Только что протестировано с SDN 4.1.2 и OGM 2.0.4 — org.neo4j.ogm.exception.CypherException пузырьки прямо наверх, не обернутые другим исключением. В бэклоге есть функция, гарантирующая, что исключения OGM преобразуются в стандартные исключения Spring. Можете предоставить больше информации? Трассировка стека?