gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:33:27 29 4
gpt4 key购买 nike

我们正在努力扩大我们的网络应用程序的数据库兼容性范围。我们的应用程序是带有 JSP、Servlet 和 EJB 的 Java EE。我们试图使我们的应用程序兼容的数据库是 SQL Server 2008。

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

违反 UNIQUE KEY 约束“UQ__Key__8861A9F23EDC53F0”。无法在对象“dbo.Entity”中插入重复的键。
org.hibernate.exception.ConstraintViolationException:无法插入:[foo.beans.eproc.entity.Entity]

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

  1. 向维护 UQ Key 约束的实体添加构造函数,以便将记录初始化为唯一且非空的。这解决了之前与其他关键约束违规相关的问题。
  2. 我们了解到 Hibernate 在删除之前执行插入的问题。早些时候,我们认为这可能是导致问题的原因。目前,作为更新过程的一部分,所有存储的附件都会被删除,并且 session 中的所有当前附件都会添加到数据库中。我们的想法是,如果它确实尝试在删除之前执行插入,那么它会引发附件的 UQ 键违规。
  3. 如果我们只是删除 SQL Server 中的 UQ 键并添加第二个附件,数据库更新不会出现问题,并且记录中似乎不包含任何非唯一数据。

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

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

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

最佳答案

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

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

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

关于java - 违反 UNIQUE KEY 约束。无法在对象中插入重复的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265679/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com