为什么我的Hibernate插入不反映在我的Hibernate查询中?

时间:2017-07-25 01:08:49

标签: java hibernate

我被要求为基于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 committingdisabling 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

[/编辑]

1 个答案:

答案 0 :(得分:0)

我认为只要尚未完成更改的事务,底层DBMS可能会隐藏对其他事务的更改。 getTheList是否在额外的事务中运行?你在使用oracle还是postgres?