在hibernate中面临多步转换的几个问题。这就是我在做的事。
我的一个DAO方法
代码看起来像这样:
@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
答案 0 :(得分:0)
有些事情可能是错的
您手动更新第一个实体的外键是可疑的;如果你正确地建立了你的关系,hibernate应该为你做。
您的测试类是如何设置的?您是否在某个时刻回滚数据以使测试透明?我得到的是,如果你看到sql,但是在你的测试中你看不到数据,你试图在错误的时间访问你的数据进行测试 - 数据还没有提交,或者数据已经回滚(如果您正在回滚)。您可能想要尝试的一件事是关闭tx,然后运行测试。请注意,您必须手动清理数据,但应指出测试中的tx配置是否存在问题。
Spring提供了一些基础测试类,可以为您管理事务和滚动数据....
答案 1 :(得分:0)
感谢您的回复。你是对的。
虽然你会发布这个答案,但我意识到问题是什么,并尝试过,工作!!
这是你帖子中的第2点。基本上junit测试用例本身使用“AbstractTransactionalJUnit4SpringContextTests”并通过@Rollback管理测试后的数据库提交/回滚。所以基本上,我试图更新的数据并不是首先创建的。我仍然惊讶于我没有在控制台上看到任何错误!!
我接受你的回答是正确的。万分感谢!
-J