违反UNIQUE KEY约束。无法在对象中插入重复键

时间:2012-02-13 18:14:47

标签: java sql-server windows-7 jboss

我们正在努力增加Web应用程序的数据库兼容性范围。我们的应用程序是带有JSP,Servlet和EJB的Java EE。我们试图使我们的应用程序兼容的数据库是SQL Server 2008。

我们遇到的问题发生在我们的应用程序中,当用户尝试在特定屏幕上附加多个文件并使用多个上传界面时。用户可以正确地成功附加第一个文件和数据库更新。当用户在添加第二个附件后尝试更新时,将抛出唯一键约束违例[无法插入重复值]错误。以下是输出的错误:

Violation of UNIQUE KEY constraint 'UQ__Key__8861A9F23EDC53F0'. Cannot insert duplicate key in object 'dbo.Entity'. org.hibernate.exception.ConstraintViolationException: could not insert: [foo.beans.eproc.entity.Entity]

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

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

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

    1. 删除SQL Server中的唯一键是否可以解决此问题?
    2. 在DELETES之前有没有办法验证Hibernate是否正在执行INSERTS?如果是这样,我们如何检查?
    3. 如果在上述情况下Hibernate存在问题,我们如何解决此问题?

1 个答案:

答案 0 :(得分:1)

1)它可能是一个解决方案,但是,如果您需要该约束来确保唯一值,那么您将失去它。此外,对于它的价值,查询优化器使用了唯一约束来使查询运行得更快,因此丢失可能会损害性能和数据完整性。

2)有nhibernate监控工具,但也有TSQL监控工具。如果您正在使用SQL SErver 2008或更好地运行扩展事件会话并捕获通过rpc complete和sql批处理完成事件调用的查询。 SQL Server 2005&早些时候,您可以通过Profiler设置服务器端跟踪。

3)不熟悉Hibernate在这里发表评论,抱歉。