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

Spring@Transactional Issure/Challenge(放置在服务层时

汪文光
2023-03-14

我的Spring应用程序分层为Bean、Service和dao。所有的@Transactional注释都在服务层中。

这是一个特定场景中的伪代码。

userBean.java

saveUser() {
    userService.manageUser();
}
@Transactional
public void manageUser() {
    userDAO.createUser();
    userDAO.updateParentUser();
}

UserDAOImpl.java

createUser() {
    //insert user record in database
}

updateParentUser() {
    //update parent user's database record
}

在我的save user测试用例中,update parent user操作在某些情况下可能会由于主键冲突而失败,这是意料之中的。

由于@Transactional注释是在service类中实现的,因此此违规异常将只在bean类中通知。

如果我在service类中添加一个新方法,并从那里调用manageUser(),那么@Transactional注释将无法正常工作。这是由于AOP的局限性/属性造成的。Spring需要外部调用@Transactional方法。

共有1个答案

南宫胡媚
2023-03-14

在从@Transactional方法返回之前,不会提交创建/更新。如果create/update在此之前被刷新到数据库中,那么您可能会在方法中得到异常,但在您的情况下,它直到提交才被刷新。

您可以在提交之前强制刷新创建/更新。您没有说明您使用的是Hibernate还是JPA,但session.flush()EntityManager.flush()应该可以实现此目的。

 类似资料:
  • 问题内容: 首先,可能是我要问一些以前已经问过并回答过的问题,但我却无法找回搜索结果。一般而言(或到目前为止):)我们在服务层上定义事务注释,通常是Spring Hibernate Crud。 现在,我需要根据客户站点在域模型之间进行选择。假设客户端A使用我的域模型都很好,但是另一个客户端网站会给我一个Web服务而不是使用我们的域模型。 我应该替换哪一层。我认为必须是DAO,它将从Web服务获取我

  • 在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?

  • 问题内容: 我需要有关Spring AOP的帮助。我有以下代码: application-context.xml application-context-aop.xml 当我尝试在Tomcat上加载应用程序时,出现以下异常: 我在Web层具有与记录我的应用程序相同的配置,并且工作正常,但是当我将AOP放在Service层时,会遇到此异常。 我正在使用Spring MVC,并在web.xml上配置了

  • 问题内容: 请看下面的简单代码: 如您所见,以上代码旨在从服务器(以json格式)获取商店列表,并将响应映射到Shop对象数组。现在,我需要放置新商店,例如/ api / shop / 1。请求实体应具有与返回实体完全相同的格式。 我应该在网址中添加/ 1,创建新的Shop类对象,并用我要放置的值填充所有字段,然后与HttpMethod.PUT进行交换吗? 请为我澄清一下,我是Spring的初学者

  • 最近,我看到一篇博文说,“出于文档的目的,我们在服务层使用mocking(在使用spring rest doc的环境中)”,所以这篇博文使用了类似spring的@MockBean到服务层对象的注释。 但我认为,如果我模仿服务层- 所以我觉得这是不对的但是, 我想知道什么更好,或者如何将service object与spring rest文档一起使用 恳求回答

  • 我怀疑Spring注释放在哪一层?以下是两种情况: > case:将放置在DAO层中 案例:将放置在服务层中? 我只使用Spring,而不是SpringMVC。