【问题标题】:Violation of UNIQUE KEY constraint. Cannot insert duplicate key in object违反 UNIQUE KEY 约束。无法在对象中插入重复键
【发布时间】:2012-03-05 03:49:31
【问题描述】:

我们正在尝试增加我们的 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 键约束的实体中,以便将记录初始化为唯一且非空。这解决了以前与其他键约束冲突的问题。
  2. 我们了解到 Hibernate 在 DELETES 之前执行 INSERTS 的问题。早些时候,我们认为这可能是导致问题的原因。目前,作为更新过程的一部分,将删除所有存储的附件,并将会话中的所有当前附件添加到数据库中。我们的想法是,如果它真的试图在 DELETES 之前执行 INSERTS,那么它会引发与附件的 UQ Key 冲突。
  3. 如果我们只是删除 SQL Server 中的 UQ 键并添加第二个附件,则数据库会毫无问题地更新,并且记录中似乎不包含任何非唯一数据。

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

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

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

【问题讨论】:

标签: java sql-server windows-7 jboss


【解决方案1】:

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

2) 有 nhibernate 监控工具,但也有 TSQL 监控工具。如果您使用的是 SQL SErver 2008 或更好的版本,请运行扩展事件会话并捕获通过 rpc 完成和 sql 批处理完成事件调用的查询。 SQL Server 2005 及更早版本您可以对通过 Profiler 设置的服务器端跟踪执行相同操作。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多