我被要求为基于hibernate的数据访问对象编写一些编码测试。
我认为我会从一个简单的测试开始:当我保存模型时,它应该在dao.getTheList()
返回的集合中。问题是,无论如何,当我调用dao.getTheList()
时,它总是一个空集合。
应用程序代码已经在生产中使用,所以让我们假设问题出在我的测试代码上。
@Test
@Transactional("myTransactionManager")
public void trivialTest() throws Exception {
...
// create the model to insert
...
session.save(model);
session.flush();
final Collection<Model> actual = dao.getTheList();
assertEquals(1, actual.size());
}
测试输出为expected:<1> but was:<0>
到目前为止,我在插入后尝试explicitly committing和disabling the cache,但这没效果。
我不打算成为Hibernate的主人,我没有足够的时间阅读整个文档。如果不知道从哪里开始,这似乎对社区来说可能是个好问题。
在测试的验证步骤执行之前,我该怎么做才能确保我的Hibernate插入被刷新/提交/解除缓存/或者它是什么?
[edit]关于我尝试过的一些额外信息。我尝试在插入和dao.getTheList()
调用之间手动提交事务,但我得到错误Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
@Test
@Transactional("myTransactionManager")
public void trivialTest() throws Exception {
...
// create the model to insert
...
final Transaction firstTransaction = session.beginTransaction();
session.save(model);
session.flush();
firstTransaction.commit();
final Transaction secondTransaction = session.beginTransaction();
final Collection<SystemConfiguration> actual = dao.getTheList();
secondTransaction.commit();
assertEquals(1, actual.size());
}
我还尝试将@Transactional
注释从测试线程中删除并注释每个2个辅助方法,每个Hibernate作业一个。为此,虽然我收到错误:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
。
[/编辑]
答案 0 :(得分:0)
我认为只要尚未完成更改的事务,底层DBMS可能会隐藏对其他事务的更改。 getTheList是否在额外的事务中运行?你在使用oracle还是postgres?