【问题标题】:Why isn't my Hibernate insert reflected in my Hibernate query?为什么我的 Hibernate 插入没有反映在我的 Hibernate 查询中?
【发布时间】:2017-12-30 17:32:03
【问题描述】:

有人要求我为基于休眠的数据访问对象编写一些编码测试。

我想我会从一个简单的测试开始:当我保存一个模型时,它应该在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:&lt;1&gt; but was:&lt;0&gt;

到目前为止,我在插入后尝试了explicitly committing,并尝试了disabling the cache,但都没有成功。

我不想成为 Hibernate 的大师,而且我没有足够的时间阅读整个文档。在不知道从哪里开始的情况下,这似乎对社区来说是一个很好的问题。

在测试的验证步骤执行之前,我可以做些什么来确保我的 Hibernate 插入已刷新/提交/取消缓存/或其他任何内容?

[编辑] 关于我尝试过的一些附加信息。我尝试在插入和调用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.

[/编辑]

【问题讨论】:

  • dao.getTheList() 中有什么内容;
  • 这是一个空集合

标签: java hibernate


【解决方案1】:

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

【讨论】:

  • 这是 H2 内存数据库。我倾向于同意,它与交易有关。不过,事务是由测试方法上的注释驱动的。我试过手动提交事务,但它只是错误。我将扩展我的问题以包括我对此所做的测试。
  • 在 ejb 中不允许这种声明式和显式事务管理的混合。所以我不知道该怎么做。但也许:stackoverflow.com/questions/24338150/… 可以帮忙吗?或者您可以将插入封装到使用“REQUIRES_NEW”完成的方法中。或者,最后 dao 中的查询无法正常工作。
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2020-01-22
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多