我们正在尝试增加我们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]
到目前为止,我们已经尝试了以下解决这个问题:
- 添加构造函数来维持的UQ键约束,以实体初始化记录是唯一的和非空的。这已解决了其他关键约束违规问题。
- 我们已经读过Hibernate在DELETES之前执行INSERTS的问题。早些时候,我们认为这可能会导致问题。目前,作为更新过程的一部分,所有存储的附件都将被删除,会话中的所有当前附件都会添加到数据库中。我们的想法是,如果它真的试图在DELETES之前执行插入操作,那么它会对附件产生UQ密钥违例。
- 如果我们只是删除SQL Server中的UQ键并添加第二个附件,数据库更新没有问题,并且它看起来没有包含在记录中的任何非唯一数据。
不幸的是,上面的[1]没有解决问题,因为UQ密钥违例仍然被抛出。对于上面的[2],我们无法验证Hiberante是否在DELETES之前执行INSERTS。
回答以下问题将帮助我们取得一些进展:
- 能消除在SQL服务器的唯一密钥是一个潜在的解决这个问题?
- 有没有一种方法可以验证Hibernate是否在DELETES之前执行INSERTS?如果是这样,我们如何检查?
- 如果在上述情况下Hibernate出现问题,我们该如何解决这个问题?
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
在发布错误之后查看表定义和唯一键列的值将会很有帮助。 – 2012-02-13 18:24:43