Hibernate的transaction嵌套

来源:互联网 发布:淘宝内衣模特雪碧 编辑:程序博客网 时间:2024/06/13 03:56

HIbernate中,通常都会打开一个transaction来执行一次操作,transaction被称为事务。但是有时候在写一些递归的操作的时候,会不小心犯下事务嵌套的错误,就会得到错误nested transactions not supported,意为不支持嵌套的事务。通常这会在多层N对N的操作中出现,特别是删除操作。因为save和update只要你在实体类里设置好,Hibernate就会自动帮你保存。但是删除的时候,如果你只删除最顶层的数据,就会报错,因为存在外键引用。
有两种方法可以避免这种问题发生,一是先从最顶层开始删除,但是要将本层和下一层的关系设置为null,比如A对B是一对多的关系,A中有个Set Bs,在删除A的时候,首先要设置Bs=null,然后再删除A。但是这样你就要注意,如果你删除A的同时要把A中所有包含的子项都删除,在按这种方式删除A之后,要留下A与B关联的外键信息。然后利用这个外键信息再去删除Bs,一不小心就会在数据库里留下垃圾数据。
另外一种方式则是从最底层开始删除,也就是删除A的时候先删除所有与之关联的B,但是如果你删除A和删除B是用的两个方法分开写,就要注意transaction的嵌套问题。假如你首先要查询A的信息,这个时候开启了一个transaction,查询之后用A的信息去删除B,再去调用B的删除方法,又要开一个transaction,删除之后回到A,利用在A中开启的transaction接着删除A,这就出现了transaction的嵌套。这个也有两种方法可以解决。
1、在查询完A的信息之后,关闭本次使用的transaction,也就是执行一次session.getTransaction().commit()。从B回来之后,另开一个事务去执行A的删除(注意session.getTransaction().commit()会同时关闭当前的session,所以也要再新建一个session)。
2、方法的调用将transaction作为参数,全部删除使用同一个transaction。
3、也许Hibernate有自己的事务嵌套机制,但是我还没有掌握

0 0
原创粉丝点击