hibernate中的多步骤事务

hibernate中的多步骤事务,hibernate,transactions,Hibernate,Transactions,我在hibernate中使用多步骤转换时遇到了一些问题。这就是我正在做的 我的道法之一 在表a中创建新记录并检索Oracle生成的主键 使用步骤1中检索到的主键更新表B中的一行 代码如下所示: @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public Object myDAOMethos(...){ .... getHibernateTemplate().execute( new

我在hibernate中使用多步骤转换时遇到了一些问题。这就是我正在做的

我的道法之一

  • 在表a中创建新记录并检索Oracle生成的主键
  • 使用步骤1中检索到的主键更新表B中的一行
  • 代码如下所示:

    @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
    public Object myDAOMethos(...){
        ....
        getHibernateTemplate().execute(
    new HibernateCallback<Long>() {
     public Long doInHibernate(Session session)
       throws HibernateException, SQLException {
      // Create a new record in table A
      session.save(objA);
    
      final long pKey = objA.getId();
    
      // Update the row in table B
      org.hibernate.Query query = session
          .getNamedQuery("updateBQuery").setLong("idB",pKey... 
       query.executeUpdate();
       }
      }
      return true;
     }
    });
    }
    
    @Transactional(readOnly=false,propagation=propagation.REQUIRES\u NEW)
    公共对象MyDaoMethodos(…){
    ....
    getHibernateTemplate().execute(
    新的HibernateCallback(){
    公共长形多因希伯内特(会议)
    抛出HibernateeException、SQLException{
    //在表a中创建新记录
    session.save(objA);
    final long pKey=objA.getId();
    //更新表B中的行
    org.hibernate.Query=会话
    .getNamedQuery(“updateBQuery”).setLong(“idB”,pKey。。。
    query.executeUpdate();
    }
    }
    返回true;
    }
    });
    }
    
    该方法被绑定在一个事务下

    我的问题: 当我在tomcat上运行此代码时,一切正常。但是当我尝试为此执行junit测试用例时,表B上的更新从未发生。尽管我可以在控制台输出上看到更新SQL(hibernate.show_SQL=true)。也没有例外!只发生了插入,就这样

    不知道这里发生了什么!有什么想法吗

    问候,,
    -有些事情可能是错的

  • 您可能被手动更新了第一个实体的外键;如果您正确设置了关系,hibernate应该为您这样做

  • 您的测试类是如何设置的?您是否在某个时候回滚数据以使测试透明?我的意思是,如果您看到了sql,但是在您的测试中没有看到数据,那么您试图在错误的时间访问您的数据以进行测试—要么数据没有提交,要么数据已经被回滚返回(如果您正在回滚)。您可能希望尝试的一件事是关闭tx,然后运行测试。注意,您必须手动清理数据,但它应该指示测试中的tx配置是否存在问题


  • Spring提供了一些基本测试类,可以为您管理事务和回滚数据……

    谢谢您的回复。您说得对

    当你发布这个答案时,我意识到问题出在哪里,并尝试了一下,成功了

    这是您文章中的第2点。基本上,junit测试用例本身使用“AbstractTransactionalJUnit4SpringContextTests”并在测试后通过@rollback管理DB提交/回滚。因此,基本上,我试图更新的数据并没有首先创建。我仍然感到惊讶的是,我在控制台上没有看到任何错误

    我接受你的正确答案。非常感谢


    -J

    此外,关于第1点,“外键”由于某些限制实际上没有设置为外键。