繁体   English   中英

休眠中的多步骤事务

[英]Multi step transaction in hibernate

在休眠状态下,多步转换面临的问题很少。 这就是我在做什么。

我的DAO方法之一

  1. 在表A中创建一个新记录,并检索Oracle生成的主键。
  2. 使用在步骤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;
 }
});
}

该方法受约束。

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

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

问候,-J

有些事情可能是错误的

  1. 您手动将第一个实体的外键更新为可疑; 如果您正确设置了人际关系,hibernate应该为您执行此操作。

  2. 您的考试班如何设置? 您是否在某个时候回滚数据以便测试透明? 我要说的是,如果您看到sql,但是在测试中却看不到数据,则试图在错误的时间访问数据以进行测试-要么数据尚未提交,或数据已经回滚(如果要回滚)。 您可能想尝试的一件事是关闭TX,然后运行测试。 请注意,您将必须手动清理数据,但它应指出测试中的tx配置是否是问题所在。

Spring提供了一些基础测试类,可以管理事务并为您回滚数据。

谢谢回复。 你是对的。

当您将发布此答案时,我意识到问题出在哪里并尝试了,行之有效!!

这是您帖子中的第二点。 基本上,junit测试用例本身使用“ AbstractTransactionalJUnit4SpringContextTests”,并通过@Rollback管理测试后的数据库提交/回滚。 因此,基本上,我尝试更新的数据并不是一开始就创建的。 仍然感到惊讶的是,我没有在控制台上看到任何错误!

我接受您的答案是正确的答案。 万分感谢!

-J

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM