Hibernate不会回滚与触发器相关的更改

时间:2016-01-12 13:40:42

标签: mysql spring hibernate triggers transactions

我有一个MySQL数据库的应用程序。在此表中插入新行时,此数据库具有表A和触发器。

现在,当我创建新实体(与此表相关联)并在事务中使用session.save(aEntity);保存它时,但是当我执行保存时,MySQL会激活表A的触发器并创建一个新条目其他一些表,但在我调用transaction.commit()之前,表A中的行不会保存。

我有时需要回滚transaction.rollback(),但触发器会在其他表中创建新条目,并且不会被删除。

我该怎么做?

1 个答案:

答案 0 :(得分:3)

当你调用save时,Hibernate将实体附加到持久化上下文,并且在刷新期间将添加数据库行。对于MySQL,如果使用IDENTITY实体标识符生成器,​​则插入将立即发生。

触发器可能会在其他表中添加记录,但这也是当前数据库事务的一部分(假设您使用InnoDB),因此当您回滚事务时,TableA和其他表都不会保留挂起的更改。

所以你应该没事。

更新

  

我会试着解释一下。我有一个表A和一个表B.在MySQL中,我有一个   触发当在A中创建行时,触发器在B中创建一行   与A中的行的标识符相同(但没有外键)。在里面   Hibernate Session,我创建了一个事务并创建了A的实体并保存它。该   触发器被激活并立即在B中创建一个条目,但在那里   仍然没有在A中输入,因为我还没有提交交易。我做了之后   回滚时,表A被还原但B中的行由触发器创建   仍在那里,引用A中不存在的条目。 B没有   有外键并使用MyISAM。

这不是典型的数据库设置,这不是真正的Hibernate问题。你也可以用普通的JDBC来解决这个问题。问题是表A使用事务感知InnoDB存储引擎,而表B工作在自动提交模式,因为配置为使用MyISAM。