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有自己的事务嵌套机制,但是我还没有掌握
- Hibernate的transaction嵌套
- hibernate transaction session (嵌套事务的说明)
- hibernate transaction session (嵌套事务的说明)
- hibernate transaction session (嵌套事务的说明)
- Hibernate的Transaction SessionFactory
- 关于Hibernate的Transaction
- Hibernate 的 Transaction接口
- hibernate的transaction简介
- Hibernate的Transaction详解
- hibernate的Transaction接口理解
- Hibernate的Session和transaction
- Hibernate的Session详解(transaction)
- hibernate- Transaction
- hibernate 事务嵌套导致org.hibernate.TransactionException: Transaction not successfully started
- Spring Transaction 嵌套调用
- hibernate中的ThreadLocalSessionContext和Transaction的关系
- Hibernate中Transaction事务的批量提交
- Hibernate Criteria的嵌套查询
- gettimeofday优化
- swift 单例
- Ubuntu configuration Scala environment
- 06 事件、触摸、响应者链
- 积分图像(Integral Image)
- Hibernate的transaction嵌套
- Java线程面试题
- 黑马程序员--继承 抽象 接口
- DataSet,DataGridView的相关操作
- day05 homework
- Scala访问修饰符
- Laravel Repository 模式-让你控制器更易读
- SD卡读写实例
- 最大似然估计 (MLE) 最大后验概率(MAP)