hibernate中的多步事务

时间:2011-01-18 16:17:57

标签: hibernate transactions

在hibernate中面临多步转换的几个问题。这就是我在做的事。

我的一个DAO方法

  1. 在表A中创建新记录并检索Oracle生成的主键。
  2. 使用在步骤1中检索到的主键更新表B中的一行
  3. 代码看起来像这样:

    @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;
     }
    });
    }
    

    该方法受到转移约束。

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

    不确定这里发生了什么!有任何想法吗!?

    的问候, -J

2 个答案:

答案 0 :(得分:0)

有些事情可能是错的

  1. 您手动更新第一个实体的外键是可疑的;如果你正确地建立了你的关系,hibernate应该为你做。

  2. 您的测试类是如何设置的?您是否在某个时刻回滚数据以使测试透明?我得到的是,如果你看到sql,但是在你的测试中你看不到数据,你试图在错误的时间访问你的数据进行测试 - 数据还没有提交,或者数据已经回滚(如果您正在回滚)。您可能想要尝试的一件事是关闭tx,然后运行测试。请注意,您必须手动清理数据,但应指出测试中的tx配置是否存在问题。

  3. Spring提供了一些基础测试类,可以为您管理事务和滚动数据....

答案 1 :(得分:0)

感谢您的回复。你是对的。

虽然你会发布这个答案,但我意识到问题是什么,并尝试过,工作!!

这是你帖子中的第2点。基本上junit测试用例本身使用“AbstractTransactionalJUnit4SpringContextTests”并通过@Rollback管理测试后的数据库提交/回滚。所以基本上,我试图更新的数据并不是首先创建的。我仍然惊讶于我没有在控制台上看到任何错误!!

我接受你的回答是正确的。万分感谢!

-J