当前位置: 首页 > 知识库问答 >
问题:

如何在活动spring事务中将数据刷新到数据库中?

甄文彬
2023-03-14

我想使用spring测试框架测试hibernate Session的save()方法。@测试方法为:

@Test
@Transactional
public void testSave() {
    User expected = createUser();
    getGenericDao().currentSession().save(expected);
    User actual = getUser(generatedId);
    assertUsersEqual(expected,actual);
}

我想刷新用户到数据库。我希望我的用户在此方法后在数据库中

getGenericDao().currentSession().save(expected);

然后我要使用spring data framework转到database并通过下一行获取这个保存的用户:

User actual = getUser(generatedId);
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
@Transactional
public void doSave(User user){
    getGenericDao().currentSession().save(user);
}

非常感谢您的回应。问题是方法flush()没有将我的用户放入数据库,我尝试了isolation.read_uncommitted,但它没有将我的用户放入数据库。我可以实现我想要的,但前提是我在@test方法上关闭spring事务,并在编程事务中进行保存。但是@test方法不会回滚,将保存的用户留给后续的@test方法。这里@test方法保存用户不像@test方法删除用户那样危险,因为它不回滚。因此,必须对@Test方法提供spring事务性支持,我无论如何都不能用它将我的用户(或删除)放入数据库。实际上,只有在@test方法结束并结束了@test方法的事务之后,用户才会被放入(或删除)数据库。所以我想把我的用户保存到@test方法中间的数据库中,并在@test方法的结尾回滚它

谢谢!

共有1个答案

湛博易
2023-03-14

最后我坚持了下面的解决方案:

首先,我的@test方法没有在spring@transactional支持中运行。看看这篇文章,知道它可能有多危险。接下来,我不在@test方法中使用@repositorybeans,而是在@test方法中使用@servicebeans,这些beans使用@transactional注释。奇迹是@test这样的方法

@Test
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void testSave() {
    Answer created = createAnswer();
    Long generatedId = answerService.save(created);
//at this moment answer is already in db
    Answer actual=getAnswerById(generatedId);
... }

将我的应答对象放入数据库(就在answerservice.save(created);之后),方法getanswerbyid转到数据库并提取它以检查保存是否正确。
为了消除对@test方法中数据库的更改,我通过jdbctestutils.executesQLscript重新创建数据

 类似资料:
  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb

  • 在我的应用程序中,我试图将数据从我的发送到一个名为的服务。这是我的以下代码: MainActivity.class: BGS服务。课程: 但我没有在服务类中获取数据。以下是我得到的错误: 02-25 09:05:41.166:E/AndroidRuntime(2633): JAVAlang.RuntimeException:无法启动活动 组件信息{com.microapple.googleplac

  • 我正在尝试使用SpringJTA-JPA-Hibernate了解事务传播的行为。 本质上,我正在尝试更新一个实体。为此,我编写了一个测试方法,其中我使用实体管理器(em)查找方法获取对象(所以现在这个对象是管理对象)。更新获取的对象的属性。然后可选地调用正在调用em.merge的服务层(服务层传播=必需) 现在我这里有三个变体: > < li> 测试方法没有事务注释。更新提取的对象的属性,不调用服

  • 我有三节课 1.菜单活动 2.LocationUpdateService 3.多重标记器 1.菜单活动 2、LocationUpdateService:(这是服务类) 3、多重标记(活动) 我的问题是:当我打开我的菜单活动我的Toast消息打印发送数据到广播接收器,然后点击按钮我调用MultipleMarker。我无法从服务中获取值。。。但当我按下后退按钮时,我重定向到MenuActivity,此

  • 问题内容: 我在通过Notification从服务向活动发送数据时遇到问题,我单击了一个活动被调用的通知,但是当我尝试通过捆绑包添加一些参数时,我无法获得所谓的intent中的参数,我经历了链接 如何将通知单击中的参数发送到活动? 但是仍然没有运气。 其他人也发生过同样的问题吗? 提前致谢。 问题答案: 您还必须修改清单文件。 这是有效的示例: 这些变量和方法是Service类的成员: 这是Mai

  • 问题内容: 每当我将SQL Server数据库移到新服务器时,我总是移至数据库备份和还原。我见过很多人,特别是DBA的人,他们会改为分离/重新附加MDF文件。首选方法是什么,为什么?我发现备份/还原更安全,更不会出现损坏的情况。 问题答案: 我就是这么做的 对于我们的小型数据库,我做了备份/还原- 只是因为我觉得它“更安全”。但是,在移动LARGE数据库时,仅进行分离,复制和附加操作要快得多。这样