【问题标题】:Hibernate receiving SQL error on insert due to FK constraint由于 FK 约束,Hibernate 在插入时收到 SQL 错误
【发布时间】:2019-01-02 11:28:20
【问题描述】:

我在使用 Hibernate 将一些数据插入 SQL Server 表时遇到了一些问题。我有一个表,并且我有一个从表到自身的 FK,以建立该表中的实体彼此相关。表的 P​​K 是 uniqueidentifier 类型,FK 也是 uniqueidentifier 类型,在我的 Java 代码中由 UUID 表示。

问题是,当我尝试在设置了这些 FK 之一的情况下将对象插入到我的表中时,我收到以下错误:

java.sql.SQLException: The INSERT statement conflicted with the FOREIGN KEY SAME TABLE constraint <FK_NAME>. The conflict occurred in database <DB_NAME>, table <TABLE_NAME>, column <PK_NAME>.
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372) ~[jtds-1.3.1.jar:1.3.1]
at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988) ~[jtds-1.3.1.jar:1.3.1]
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421) ~[jtds-1.3.1.jar:1.3.1]
at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:671) ~[jtds-1.3.1.jar:1.3.1]
at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:613) ~[jtds-1.3.1.jar:1.3.1]
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:572) ~[jtds-1.3.1.jar:1.3.1]
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:727) ~[jtds-1.3.1.jar:1.3.1]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_172]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_172]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_172]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_172]

但是,我尝试使用完全相同的参数使用 SQL Server Management Studio 在 DB 上直接运行 INSERT 语句,并且 INSERT 语句工作正常。我还在调试器中跟踪了我的代码,调试跟踪显示 UUID id 被正确地从 String 解析为 UUID。我也直接从数据库中的 PK 字段复制粘贴了该值,以确保没有拼写错误。

我觉得我已经尝试了所有方法,但我不知道为什么会出现此错误。谁能帮我吗?谢谢。

【问题讨论】:

  • 接下来,我将使用 SQL Profiler(或扩展事件会话)跟踪从您的应用程序到 SQL 的调用序列,同时重现此问题。
  • 听起来很傻,因为它直接与 SQL Studio 一起工作。通常,如果是trigger 导致了这个问题,它也会在那里发生(这是我的第一直觉)。三重检查您是否确实连接到您认为的服务器/数据库/表。使用 Studio 对该表进行更改,然后使用您的连接字符串将其选中。真的感觉像那样的问题。
  • @sniperd 如果我不包含该 FK 字段(它是一个可为空的字段),那么该请求将完美运行(它将正确的数据插入到正确数据库的正确表中)。
  • 接下来我唯一能想到的就是是否真的有instead of trigger 或者发生了一些非常奇怪的事情。听起来你真的做对了一切。

标签: sql-server hibernate foreign-keys


【解决方案1】:

我想通了。事实证明,UUID 在传输到数据库的过程中以某种方式损坏,因为我使用了一种不推荐使用的方法来使用 Hibernate 进行编写。写入数据库的 UUID(我的 PK 字段和我的 FK 字段)已损坏,因此它们不匹配。我将实现更改为使用this SO question 中描述的实现,然后一切正常。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多