我想要的很简单:验证节点ID。
项目结构是: 控制器(端点) - 服务 - DAO。服务层中的@transaction,以及服务层中的验证。
在端点中,传入DTO对象。验证服务层中的节点ID并保存到DAO层中的neo4j数据库。在DTO对象(例如,学生)中,我传入另一个节点ID(egClass),用于建立学生和班级关系。在保存之前,我会对节点(Class)id进行验证。
如果我使用repository.findOne(id)
并传入存在于数据库但错误类型的节点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
如果我使用以下查询并传入数据库中不存在的节点ID
start node1 = node(id)
return node1
org.neo4j.cypher.EntityNotFoundException将被引发并导致UnexpectedRollbackException。
有没有办法捕获这些异常并在没有UnexpectedRollbackException的情况下返回null或false?
或者有什么方法可以轻松检查数据库中是否存在节点ID?
答案 0 :(得分:0)
使用以下方法解决此问题:
对于节点:
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);