【发布时间】: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]
到目前为止,我们已经尝试了以下方法来解决问题:
- 将构造函数添加到维护 UQ 键约束的实体中,以便将记录初始化为唯一且非空。这解决了以前与其他键约束冲突的问题。
- 我们了解到 Hibernate 在 DELETES 之前执行 INSERTS 的问题。早些时候,我们认为这可能是导致问题的原因。目前,作为更新过程的一部分,将删除所有存储的附件,并将会话中的所有当前附件添加到数据库中。我们的想法是,如果它真的试图在 DELETES 之前执行 INSERTS,那么它会引发与附件的 UQ Key 冲突。
- 如果我们只是删除 SQL Server 中的 UQ 键并添加第二个附件,则数据库会毫无问题地更新,并且记录中似乎不包含任何非唯一数据。
不幸的是,上面的 [1] 没有解决问题,因为 UQ 密钥违规仍在引发。对于上述 [2],我们无法验证 Hiberante 是否在 DELETES 之前执行了 INSERTS。
回答以下问题将有助于我们取得一些进展:
- 删除 SQL Server 中的唯一键是否可以解决此问题?
- 有没有一种方法可以验证 Hibernate 在 DELETES 之前是否正在执行 INSERTS?如果是这样,我们如何检查?
- 如果在上述情况下 Hibernate 出现问题,我们应该如何解决这个问题?
【问题讨论】:
-
docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/…: hibernate.show_sql - 将所有 SQL 语句写入控制台。这是将日志类别 org.hibernate.SQL 设置为调试的替代方法。
-
在错误发出后查看表定义和唯一键列的值会很有帮助。
标签: java sql-server windows-7 jboss