Hibernate事务验证/对象优先级

时间:2017-07-17 09:18:29

标签: java hibernate mariadb

想象一下以下场景:

一个包含主题的表,其前身链接到同一个表/对象:

 |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”,一切都会好的。

为什么在交易过程中检查此约束?在我看来,整个交易应该是有效的,验证应该在交易结束时运行。我不知道什么吗?

有可能在许多其他场景中重新创建此优先级问题,因此很明显不能有严格的顺序,如“先删除,然后修改等......”。或者这可能是数据库中的调整问题? 有人可以帮我解决这个问题吗?

Hibernate 4.2.4; MariaDb 10.1.25

1 个答案:

答案 0 :(得分:0)

错误消息:

  

错误代码: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