我有一个MySQL数据库的应用程序。在此表中插入新行时,此数据库具有表A和触发器。
现在,当我创建新实体(与此表相关联)并在事务中使用session.save(aEntity);
保存它时,但是当我执行保存时,MySQL会激活表A的触发器并创建一个新条目其他一些表,但在我调用transaction.commit()
之前,表A中的行不会保存。
我有时需要回滚transaction.rollback()
,但触发器会在其他表中创建新条目,并且不会被删除。
我该怎么做?
答案 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。