1
palmers OP 哦对了 使用springmvc
|
4
lszwycn 2014-06-11 13:08:42 +08:00
因为JPA抛出的都是RuntimeException, 你只catch了Exception
|
5
palmers OP @lszwycn Thank you ! 但是在getxxx 方法中我使用 Exception 确实捕获到了 然后也按照我的设想 进入了下一次循环 然后的到 id 但是在该方法调用处 却因为之前的 主键约束异常 被事务回滚了 ? 为什么??
|
7
lszwycn 2014-06-11 22:17:23 +08:00
按照JPA的规范, 如果一个数据库操作抛出了jpa的异常, 那么应该回滚, 关闭EM, 因为这时候, 已经不保证EM内部的状态了, 你这里, 如果我没理解错的话, 是在getxxx的方法里面抛出了异常了, 然后catch了之后, 有继续操作了EM
|
8
palmers OP @lszwycn 是这样的 在getxxx 中有持久化操作且有异常catch 了之后 再次进行 持久化操作 ,
“按照JPA的规范, 如果一个数据库操作抛出了jpa的异常, 那么应该回滚, 关闭EM” 你这句话的意思 是不是这样的 : 我这里的getxxx 方法中 第一次主键约束异常发生,虽然我catch 了 也按照我的方式捕获到了异常, 进行下一次循环,但是这时候 已经关闭了A表连接,所以我虽然下次循环得到了有效的id 执行了 insert A表,但实际并没有持久化操作,导致后面更新B表的时候就发生外间不存在异常 然后事务回滚了 是这样的吗? 你说的 EM 是指EntityManager吗? 那我说的关闭连接应该是不准确的吧 就想异常信息中描述的那样 被标记回滚了是吗? 然后再次操作数据表就不被执行 这么理解是正确的吗? |