如何处理spring中的事务回滚异常?

时间:2014-07-10 23:25:01

标签: java spring neo4j cypher

我想要的很简单:验证节点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?

1 个答案:

答案 0 :(得分:0)

使用以下方法解决此问题:

  1. 对于节点:

            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);
    
  2. 关系

            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);