То, что я хочу, довольно просто: проверка идентификатора узла.
Структура проекта: Контроллер (конечная точка) - Служба - DAO. @transaction в слое службы, проверка на уровне сервиса.
В конечной точке перейдите в объект DTO. Проверка идентификатора узла на уровне сервиса и сохранение базы данных neo4j в слое DAO. В объекте DTO (egStudent) я передаю идентификатор другого узла (egClass), который используется для настройки отношений ученика и класса. Перед сохранением я выполняю проверку для идентификатора узла (класса).
Если я использую repository.findOne(id)
и передаю идентификатор узла, который существует в базе данных, но неправильный тип. Это повысит: org.neo4j.graphdb.NotFoundException: '__type__' property not found for RelationshipImpl #10118 of type 36 between Node[7054] and Node[6726]
что приведет к следующему исключению:
nested exception is org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException: Failed to commit, transaction rolledback
Если я использую следующий запрос и передаю идентификатор узла, который не существует в базе данных
start node1 = node(id)
return node1
org.neo4j.cypher.EntityNotFoundException будет поднято и приведет к UnexpectedRollbackException.
Есть ли способ, чтобы я поймал эти исключения и вернул null или false без UnexpectedRollbackException?
Или я могу проверить, что идентификатор узла существует в базе данных легко?
Исправьте это, используя:
Для узла:
Node node = neo4jTemplate.getNode(id);
String type = (String) node.getProperty("__type__");
if (!type.equals(nodeClass.getName())) {
throw new ResultNotFoundException("No such object (" + nodeClass.getSimpleName() + ": id=" + id + ") in database");
}
return neo4jTemplate.projectTo(node, nodeClass);
Для отношений
Relationship relationship = neo4jTemplate.getRelationship(id);
String type = (String) relationship.getProperty("__type__");
if (!type.equals(nodeClass.getName())) {
throw new ResultNotFoundException("No such object (" + nodeClass.getSimpleName() + ": id=" + id + ") in database");
}
return neo4jTemplate.projectTo(relationship, nodeClass);
repository.findOne(id)