java.lang.illegalstateexception:事务在session.begintransaction()上已处于活动状态

juud5qan  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(312)

我对hibernate还不熟悉,有一项任务是将用hibernate3编写的代码迁移到hibernate5。在调试时,我得到一个错误-java.lang.illegalstateexception:事务已经处于活动状态,并且这在方法-begintransaction()上发生。我在网上查了很多方法,但都无法纠正错误。下面是导致此错误的函数。

  1. @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
  2. public String callStoredProc(List<UniqueNoRidVo> uniqueNoRidVoMap) throws DBException {
  3. List<UniqueNoRidVo> uniqueNo = null;
  4. String return_value = null;
  5. Transaction tx = null;
  6. int count = 0;
  7. Session session = sessionFactory.getCurrentSession();
  8. try{
  9. //Deleting old records from Temp table
  10. LOG.info("IN callStoredProc -START");
  11. String query = "delete from UniqueNoRidVo";
  12. session.createQuery(query).executeUpdate();
  13. LOG.info("Old records deleted from TEMP Table");
  14. //Inserting New RIDs into Temp table
  15. if(!uniqueNoRidVoMap.isEmpty()){
  16. tx = session.beginTransaction(); //Error code
  17. for(LiqVO vo : uniqueNoRidVoMap){
  18. session.saveOrUpdate(vo);
  19. if (++count % 50 == 0) {
  20. session.flush();
  21. session.clear();
  22. }
  23. }
  24. session.flush();
  25. LOG.info("New RIDs inserted into TEMP table");
  26. }
  27. //Calling Stored procedure to generate Unique Nos.
  28. LOG.info("Calling Stored Procedure");
  29. tx=session.getTransaction();
  30. System.out.println("Calling Stored Procedure");
  31. //migrated to hibernate 5
  32. //SessionFactory sessionFactory=session.getSessionFactory();
  33. ConnectionProvider
  34. connectionProvider=liqSessionFactory.getSessionFactoryOptions().
  35. getServiceRegistry().getService(ConnectionProvider.class);
  36. Connection connection=connectionProvider.getConnection();
  37. CallableStatement st = connection.prepareCall("{ call SP_FETCH_UQNO(?) }");
  38. // CallableStatement st = session.connection().prepareCall("{ call SP_FETCH_UQNO(?) }");
  39. st.registerOutParameter(1, OracleTypes.VARCHAR);
  40. int abc = st.executeUpdate();
  41. LOG.info("abc output"+abc);
  42. if(abc>0) {
  43. return_value = st.getString(1);
  44. }
  45. LOG.info("Stored Procedure call completed: return_value "+ return_value);
  46. System.out.println("Stored Procedure call completed: return_value "+ return_value);
  47. }catch(HibernateException hbex){
  48. if (tx != null) {
  49. tx.rollback();
  50. LOG.error(hbex.toString());
  51. System.out.println("GD004-Error occurred in getting Unique Numbers for RID"+
  52. hbex.toString());
  53. throw new DBException("GD004-Error occurred in getting Unique Numbers for RID",
  54. hbex.toString());
  55. }
  56. } catch (SQLException sqex) {
  57. LOG.error(sqex.toString());
  58. throw new DBException("GD005-Error occurred in getting Unique Numbers for RID",
  59. sqex.toString());
  60. }
  61. return return_value;
  62. }

任何关于如何解决这个问题的建议,谢谢!

xfb7svmp

xfb7svmp1#

您可以允许框架处理事务,而不是显式地打开事务,在spring中可以使用@transactional。
您甚至可以使用tr.isactive()方法检查事务是否仍然处于活动状态
理想情况下,不需要对事务执行任何操作,因为它是由spring处理的。
例如:
案例一:spring处理的事务

  1. Session session = sessionFactory.getCurrentSession();
  2. ...
  3. return;

案例2:自行处理的交易

  1. Session session = sessionFactory.openSession();
  2. Transcation tr = session.beginTransaction();
  3. ...
  4. tr.commit();
  5. session.close();
  6. return;
展开查看全部

相关问题