2012-02-13 221 views
0

我们正在尝试增加我们Web应用程序的数据库兼容性范围。我们的应用程序是带有JSP,Servlet和EJB的Java EE。我们试图使我们的应用程序兼容的数据库是SQL Server 2008.违反UNIQUE KEY约束。无法在对象中插入重复密钥

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

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键约束,以实体初始化记录是唯一的和非空的。这已解决了其他关键约束违规问题。
  2. 我们已经读过Hibernate在DELETES之前执行INSERTS的问题。早些时候,我们认为这可能会导致问题。目前,作为更新过程的一部分,所有存储的附件都将被删除,会话中的所有当前附件都会添加到数据库中。我们的想法是,如果它真的试图在DELETES之前执行插入操作,那么它会对附件产生UQ密钥违例。
  3. 如果我们只是删除SQL Server中的UQ键并添加第二个附件,数据库更新没有问题,并且它看起来没有包含在记录中的任何非唯一数据。

不幸的是,上面的[1]没有解决问题,因为UQ密钥违例仍然被抛出。对于上面的[2],我们无法验证Hiberante是否在DELETES之前执行INSERTS。

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

  1. 能消除在SQL服务器的唯一密钥是一个潜在的解决这个问题?
  2. 有没有一种方法可以验证Hibernate是否在DELETES之前执行INSERTS?如果是这样,我们如何检查?
  3. 如果在上述情况下Hibernate出现问题,我们该如何解决这个问题?
+0

http://docs.jboss.org/hibernate/core/3。6/reference/en-US/html_single /#configuration-optional:hibernate.show_sql - 将所有SQL语句写入控制台。这是设置日志类别org.hibernate.SQL进行调试的替代方法。 – 2012-02-13 18:21:56

+0

在发布错误之后查看表定义和唯一键列的值将会很有帮助。 – 2012-02-13 18:24:43

回答

1

1)它可能是一个解决方案,但是,如果你需要这个约束来确保唯一值,那么你就失去了它。而且,对于它的价值,查询优化器使用唯一约束使查询运行得更快,从而损失可能会损害性能以及数据完整性。

2)有nhibernate监控工具,但也有TSQL监控工具。如果您正在使用SQL SErver 2008或更好地运行扩展事件会话并捕获通过rpc complete和sql批处理完成事件调用的查询。 SQL Server 2005 &之前,您可以对通过Profiler设置的服务器端跟踪执行相同的操作。 3)不知道Hibernate是否足以在此发表评论,对不起。

相关问题