繁体   English   中英

休眠事务验证/对象优先级

[英]Hibernate transaction validation / Object priority

想象以下情况:

一个带有主题的表,其前身链接到相同的表/对象:

 |ID | PREDECESSOR | DESCRIPTION |
 +---+-------------+-------------|
 | 1 | NULL        | Topic 1     |
 | 2 | 1           | Topic 2     |
 | 3 | 2           | Topic 3     |

列的前身具有唯一的约束,因为一个主题只能是一个主题的前身。

现在,我们在应用程序中删除主题2。 为此,我们必须反对:

 |ID | PREDECESSOR | DESCRIPTION |
 +---+-------------+-------------|
 | 2 | 1           | Topic 2       -> deleted
 | 3 | 1           | Topic 3       -> new predecessor, because 2 was deleted

现在,我们将这些对象保存在一个事务中:

....
PersistentTransaction trans = session.beginTransaction();
session.saveOrUpdate(object topic 3);
session.delete(object topic 2); //object order does not matter
trans.commit();

休眠日志:

Hibernate: 
update
    TOPIC
set
   .....

如您所见,很遗憾,在删除主题2之前调用了主题3的更新,导致

SqlException "Duplicate entry '1' for key 'UNIQUE_CONSTRAINT_NAME'

这个例外很明显,但是如果顺序为“删除主题2”,然后再“更新主题3”,则一切正常。

为什么在交易中间检查此约束? 在我看来,整个交易应该是有效的,并且验证应该在交易结束时进行。 我没有意识到吗?

可以在许多其他情况下重新创建此优先级问题,因此很显然,没有严格的顺序,例如“先删除,然后修改等...”。 还是在数据库中进行调整? 有人可以帮我这个忙吗?

休眠4.2.4; MariaDb 10.1.25

错误信息:

错误代码:1062。键%d的条目“%s”重复

例:

错误代码:1062。键“ PRIMARY”的条目“ 1”重复

可能的原因:

情况1:重复的值。

您要插入的数据已存在于列主键中。 主键列是唯一的,它将不接受重复的条目。

情况2:唯一数据字段。

您试图将一列添加到包含数据的现有表中并将其设置为唯一。

情况3:数据类型-上限。

auto_increment字段已达到其最大范围。


解:

情况1:重复的值。

将主键列设置为AUTO_INCREMENT。

ALTER TABLE ‘table_name’ ADD ‘column_name’ INT NOT NULL AUTO_INCREMENT PRIMARY KEY;

现在,当您尝试插入值时,请忽略主键列。 您也可以在主键列中插入NULL值以生成序列号。 如果未指定任何值,MySQL将自动分配序列号。

情况2:唯一数据字段。

创建新列而不将其分配为唯一字段,然后插入数据,现在将其设置为唯一字段。 现在可以使用了!!!

情况3:数据类型上限。

例如,当数据类型达到上限时,如果您将主键列分配为TINYINT,则最后一条记录的ID为127,插入新记录时,ID应为128。但是128不在其中TINYINT的范围,因此MySQL会将其减小到有效范围内,并尝试将其插入ID为127,因此会产生重复的键错误。

为了解决这个问题,您可以更改索引字段,根据需要将其设置为有符号/无符号INT / BIGINT,以便最大范围增加。 您可以使用以下命令来做到这一点:

ALTER TABLE ‘table_name’ MODIFY ‘column_name’ INT UNSIGNED NOT NULL AUTO_INCREMENT;

您可以使用以下函数来检索最近自动生成的AUTO_INCREMENT值:

mysql> SELECT LAST_INSERT_ID();


最终解决方法:

在应用了上述所有解决方案之后,如果仍然遇到此错误代码:1062重复输入错误,则可以尝试以下解决方法。

步骤1:备份资料库:

您可以使用以下命令备份数据库:

mysqldump database_name> database_name.sql

步骤2:删除并重新创建数据库:

使用以下命令删除数据库:

DROP DATABASE database_name;

使用以下命令创建数据库:

CREATE DATABASE database_name;

步骤3:导入数据库:

您可以使用以下命令导入数据库:

mysql database_name < database_name.sql;

应用此替代方法后,将解决重复输入错误。 希望本文能帮助您理解和解决MySQL错误代码:1062。重复输入错误。 如果仍然遇到此问题,可以通过“与我联系”页面与我联系。 我可以帮助您解决此问题。

资源链接: http : //www.rathishkumar.in/2016/01/how-to-solve-mysql-error-code-1062.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM