【发布时间】:2019-01-02 11:28:20
【问题描述】:
我在使用 Hibernate 将一些数据插入 SQL Server 表时遇到了一些问题。我有一个表,并且我有一个从表到自身的 FK,以建立该表中的实体彼此相关。表的 PK 是 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