由于FK约束,Hibernate在插入时收到SQL错误

时间:2018-07-25 15:13:32

标签: sql-server hibernate foreign-keys

使用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在数据库上运行INSERT语句,并且INSERT语句工作正常。我还在调试器中跟踪了我的代码,调试跟踪显示了UUID id正确地从String解析为UUID。我也直接从数据库的PK字段中复制粘贴了该值,以确保没有错别字。

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

1 个答案:

答案 0 :(得分:0)

我知道了。事实证明,由于我使用的Hibernate编写方法不赞成使用,因此UUID在传输到数据库的过程中由于某种原因而损坏。写入数据库(包括我的PK字段和我的FK字段)的UUID已损坏,因此它们不匹配。我更改了实现以使用SftpATTRS object中描述的实现,然后一切正常。