【问题标题】:How to handle unique constraint violation correctly in SDN4?如何在 SDN4 中正确处理违反唯一约束?
【发布时间】:2016-06-09 18:09:32
【问题描述】:

我创建了一个 Neo4j 扩展。它包含我自己的TransactionEventHandler。有时,执行其beforeCommit() 方法会导致UniquePropertyConstraintViolationKernelException。没关系。但在服务器端我收到ResultProcessingException。这个例外看起来太笼统了。我认为,它可能出于多种原因而抛出,不仅是在违反约束的情况下。所以,我的问题是我应该如何处理服务器端的约束违规?我使用SDN4。

编辑 1:所有 neo4j-ogm-* 版本都更新到 2.0.3

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-ogm-core</artifactId>
            <version>2.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j-ogm-http-driver</artifactId>
            <version>2.0.3</version>
        </dependency>
    </dependencies>
</dependencyManagement>

【问题讨论】:

    标签: neo4j unique-constraint spring-data-neo4j-4 neo4j-ogm


    【解决方案1】:

    如果您使用的是 SDN 4.0,这是一个已知问题,即抛出的异常范围太广。

    在 SDN 4.1.1 中,我们引入了包装底层 Neo4j 错误代码的 CypherException,当 Cypher 执行失败时,这会在所有 3 个驱动程序中统一抛出。如果您使用的是 SDN 4.1.1 并且没有收到此异常,则可能是我们遗漏了代码的某些区域 - 请raise a github issue 提供有关如何重现此异常的详细信息。

    更新: 意识到 SDN 4.1.1 依赖于 OGM 2.0.1,它会产生 CypherException 但不包含原因。请将 neo4j-ogm-core 和任何驱动程序版本覆盖为 2.0.3 CypherException.getCode() 应该产生 Neo.ClientError.Schema.ConstraintViolation。请注意,如果您使用嵌入式驱动程序,则会包装底层异常。但是通过 HTTP 驱动程序,不会收到此信息,因此您只会在 CypherException 中收到以下信息:

    code: Neo.ClientError.Schema.ConstraintViolation
    description: Node 7 already exists with label User and property "name"=[luanne]
    

    【讨论】:

    • 是的,这是真的。将 SDN 更新到 4.1.1 后,我收到 CypherException。描述包含这样的消息:“TransactionFailureException:执行 Cypher Transaction.CouldNotCommit 时出错”。但对我来说仍然不清楚,我如何理解问题的类型。在 TransactionEventHandler.beforeCommit() 内部,我收到了带有明确描述的 ConstraintViolationException。但在服务器端,我什么也看不到。
    • 谢谢!但是这样的配置会导致另一个问题。正如你所说,我替换了neo4j-ogm-coreneo4j-ogm-http-driver 的版本。当我尝试调用neo4jOperations.query("CREATE CONSTRAINT ON (n:Event) ASSERT n.uniqueId IS UNIQUE", Collections.emptyMap()); 时,我收到NoSuchMethodError 的描述如下:“HttpClientBuilder.setSSLContext(SSLContext)”。它以前工作过。
    • 请检查您的依赖树,所有 neo4j-ogm-* 版本都是 2.0.3
    • 是的,我确定,所有 neo4j-ogm-* 版本都是 2.0.3。看看我更新的问题。
    • 嗯,这是在 2.0.3 中引入的。 OGM 使用 4.5.2 版本的 httpclient- 周围还有其他版本吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    相关资源
    最近更新 更多