Java 违反唯一密钥约束。无法在对象中插入重复的键

Java 违反唯一密钥约束。无法在对象中插入重复的键,java,sql-server,windows-7,jboss,Java,Sql Server,Windows 7,Jboss,我们正试图为我们的web应用程序增加数据库兼容性的范围。我们的应用程序是带有JSP、servlet和EJB的JavaEE。我们试图使应用程序与之兼容的数据库是SQL Server 2008 我们遇到的问题发生在我们的应用程序中,当用户试图在一个特定的屏幕上附加多个文件,并使用一个用于多次上载的界面时。用户可以成功附加第一个文件并正确更新数据库。当用户在添加第二个附件后尝试更新时,将引发唯一密钥约束冲突[Cannot insert Duplicate value]错误。以下是输出的错误: 违反唯一

我们正试图为我们的web应用程序增加数据库兼容性的范围。我们的应用程序是带有JSP、servlet和EJB的JavaEE。我们试图使应用程序与之兼容的数据库是SQL Server 2008

我们遇到的问题发生在我们的应用程序中,当用户试图在一个特定的屏幕上附加多个文件,并使用一个用于多次上载的界面时。用户可以成功附加第一个文件并正确更新数据库。当用户在添加第二个附件后尝试更新时,将引发唯一密钥约束冲突[Cannot insert Duplicate value]错误。以下是输出的错误:

违反唯一密钥约束“UQ_uuukey_uu8861a9f23edc53f0”。无法在对象“dbo.Entity”中插入重复键。
org.hibernate.exception.ConstraintViolationException:无法插入:[foo.beans.eproc.entity.entity]

到目前为止,我们已尝试以下方法来解决问题:

  • 向维护UQ键约束的实体添加构造函数,以便将记录初始化为唯一且非空的。这解决了以前与其他关键约束冲突有关的问题
  • 我们已经了解到Hibernate在删除之前执行插入的问题。早些时候,我们认为这可能是问题的根源。当前,作为更新过程的一部分,将删除所有存储的附件,并将会话中的所有当前附件添加到数据库中。我们的想法是,如果它真的试图在删除之前执行插入,那么它将抛出附件的UQ密钥冲突
  • 如果我们只是删除SQL Server中的UQ密钥并添加第二个附件,那么数据库将毫无问题地更新,并且记录中似乎不包含任何非唯一数据
  • 不幸的是,上面的[1]没有解决问题,因为仍在抛出UQ密钥冲突。对于上面的[2],我们无法验证Hibernate是否在删除之前执行插入

    回答以下问题将有助于我们取得一些进展:

  • 删除SQL server中的唯一密钥是否可以解决此问题
  • 有没有办法在删除之前验证Hibernate是否正在执行插入?如果是,我们如何检查
  • 如果在上述情况下Hibernate存在问题,我们可以如何解决此问题
  • 1) 这可能是一个解决方案,但是,如果您需要该约束来确保唯一值,那么您就失去了它。另外,查询优化器使用唯一约束使查询运行得更快,因此丢失可能会影响性能和数据完整性

    2) 有nhibernate监视工具,但也有TSQL监视工具。如果您使用的是SQL SErver 2008或更高版本,请运行扩展事件会话并捕获通过rpc complete和SQL batch complete事件调用的查询。SQLServer2005及更早版本您可以通过探查器设置服务器端跟踪来执行相同的操作


    3) 我对Hibernate了解不够,无法在此发表评论,抱歉。

    :Hibernate.show\u sql-将所有sql语句写入控制台。这是将日志类别org.hibernate.SQL设置为debug的一种替代方法。在发出错误后,查看表定义和唯一键列的值会很有帮助。