我的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方法。
在从@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。