当前位置: 首页 > 面试题库 >

在提交中途使用AbstractTransactionalJUnit4SpringContextTests

有耀
2023-03-14
问题内容

我们想要一个运行多个线程的简单单元测试-这个想法是主线程将保存提交到数据库,然后等待辅助线程将其拾取。

我们发现必须为第二个线程提交事务才能查询数据库并找到项目。否则,它将不存在。

我们正在尝试使用H2数据库,由Hibernate管理访问以及单元测试扩展来完成此任务AbstractTransactionalJUnit4SpringContextTests

当我们尝试commit()现有交易时:

... // Create and save our model object

sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.getCurrentSession().beginTransaction();

... // Create and start second Thread, query, etc.

我们收到错误:

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:484)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:521)`

但是,当我们尝试仅扩展AbstractJUnit4SpringContextTests并使用@Transactional注释时:

@TransactionConfiguration(defaultRollback=false, transactionManager="transactionManager")
@Transactional()
public class DatabaseIntegrityTest extends AbstractJUnit4SpringContextTests {

使用上面相同的提交代码,我们将收到:

org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1041)

在我们第一次致电时getCurrentSession()

有没有办法在JUnit事务性Spring测试中进行提交?

此外,当我们尝试使用创建嵌套事务时AbstractTransactionalJUnit4SpringContextTests,我们收到:

org.hibernate.TransactionException: nested transactions not supported
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:152)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1396)

用答案编辑:

多亏了axtavt,我得以通过以下方式解决问题:

1)扩展 AbstractJUnit4SpringContextTests

2)将@Autowired用于PlatformTransactionManager

   @Autowired
   protected PlatformTransactionManager transactionManager;

3)将我的交易代码放入其中:

TransactionStatus status = transactionManager.getTransaction(null);
... // The Model-Saving Code
transactionManager.commit(status);

问题答案:

因此,您需要在测试方法内创建多个事务。如您所见,您不能使用AbstractTransactionalJUnit4SpringContextTests,因为它会为整个测试方法创建一个事务,而不能使用nude
AbstractJUnit4SpringContextTests,因为它根本不会创建任何事务。

解决方案是以AbstractJUnit4SpringContextTests编程方式在测试方法内部使用和管理事务。

您需要按照11.6程序化交易管理中所述注入PlatformTransactionManager测试,TransactionTemplate从测试中创建并使用它来划分事务。



 类似资料:
  • 我正在尝试使用php和mysql进行在线测验/调查!我第一次使用php!我想做的是从我的数据库中获取问题和它的多项选择(测验和表格问题,其中Qid、Qtext、Ans1..Ans4作为其6列),一旦用户完成测验,就按下最后一个问题的提交按钮。。所有答案应保存在Db中(测验和表格答案,以Aid、Ans、Qid作为其列)!我搜索了相关的代码,但一个都听不懂。如果有人能帮忙,我将不胜感激。谢谢

  • 问题内容: 我正在尝试在wordpress中获取ajax请求的结果,但是在javascript的警报框中却获得了“ 0”的结果,因此该表单如下所示: javascript看起来像这样: 和PHP: 有谁知道上面的代码是否正确,我也尝试过$ _REQUEST [‘name’],它不起作用。 非常感谢 问题答案: 尝试这样的操作,您没有在PHP 函数中添加期望的参数,因此必须将其添加到jQuery a

  • 我似乎有一些问题与耙子和我的cucumber特征文件。 这是詹金斯的命令。它指定了我直接放在。/features目录,所以testjson.feature就在那里。 Rakefile看起来像这样: 这非常简单,但在 Jenkins 的控制台输出中,我得到: 这告诉我它没有找到功能文件,对吗? 当我转到功能文件上方的目录并运行Cucumber时,测试就可以了! 所以,很明显我的Rake文件出错了。有

  • 如果我们在提交配置清单之前能够发现其中的语法错误将会是个好消息。 检查 Puppet 配置清单的语法可以使用 puppet parser validate 命令: # puppet parser validate /etc/puppet/manifests/site.pp err: Could not parse for environment production: Syntax error a

  • 问题内容: 我正在尝试学习asp.net,到目前为止,我可以加载其他页面内容而无需使用刷新,但是我无法弄清楚提交表单时如何使用ajax。我做了很多谷歌搜索,但是找不到合适的解决方案。这是我的代码, 控制器页面 查看页面 查看页面 问题答案: 这里是完整的例子- 让我们创建一个简单的模型- 现在,让我们创建几个动作,以使用- 发出GET和POST请求 然后让我们创建一个简单的视图,它将托管Ajax.

  • 问题内容: 单击后,我编写了以下代码以禁用网站上的提交按钮: 不幸的是,它没有发送表格。我怎样才能解决这个问题? 编辑 我想绑定提交,而不是表格:) 问题答案: 做到: 发生的事情是您实际上在完全触发该提交事件之前禁用了该按钮。 您可能还应该考虑使用ID或CLASS来命名元素,因此不要在页面上选择所有提交类型的输入。 (请注意,我使用,因此该表单在示例中并未实际提交;请在使用时将其保留。)