java - Spring 事务,EntityManager 生命周期

标签 java spring transactions entitymanager

我正在使用 spring 框架开发一个项目。 我有以下架构:所有数据库代码都在 dao 类中,所有应用程序逻辑都在服务类中,http 请求使用 spring mvc rest Controller 处理。

@Repository
public class UserDao {

    @PersistenceContext
    private EntityManager em;

    public void editUser(User user) {
        ...
    }
}

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Transactional
    public void editUser(User user) {
        ...
    }
}

@RestController
@RequestMapping(value = "/UserCtrl", produces = "application/json;charset=UTF-8")
public class UserCtrl {

    private static final Logger logger = LogManager.getLogger(AppConfig.LOGGER_NAME);

    @Autowired
    private ApplicationContext appContext;

    @RequestMapping(value = "/editUser")
    public ActionResult editUser(@ModelAttribute User user) {
        ActionResult rslt = new ActionResult();

        try {
            UserService userService = appContext.getBean(UserService.class);
            userService.editUser(user);

            rslt.setSuccess(true);
        } catch (Exception ex) {
            logger.error("editUser", ex);
            rslt.setSuccess(false);
        }

        return rslt;
    }
}

这段代码工作正常。 我无法理解的一件事是,当仅在 UserDao 类中注入(inject) EntityManager 时,UserService bean 的 aop 代理如何启动事务。有人可以向我解释这是如何工作的以及 EntityManager 生命周期是如何由 spring 框架管理的吗?

感谢任何帮助。

最佳答案

TransactionManager 负责管理事务边界 在 Spring 框架中。 当您使用 @Transactional 注释业务方法时,您正在使用一个方面来检测该方法。 在执行该方法之前,此方面与 TransactionManager 交互,后者决定是否有必要创建新的 Transaction 或使用预先存在的 Transaction。在创建新事务的情况下,从 EntityManagerFactory 创建一个新的实体管理器,并与事务一起关联到当前线程。

EntityManager 负责迭代数据库。当您使用 @PersistenceContext 注入(inject)它时,Spring 会向 EntityManager 注入(inject)一个代理。 每当在 EntityManager 代理中执行操作时,它都会查找与线程关联的 EntityManager。

关于java - Spring 事务,EntityManager 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620419/

相关文章:

java - 如何向 Web 服务发送 Soap 请求

java - 为什么不应该声明一个受继承保护的变量?

java - 当用户键入 'EXIT' 时,程序应关闭并显示所有先前的输入

java - 我可以使用 Spring Integration 通过 RabbitMQ 进行同步/阻塞调用吗?

java - 没有xml的spring+hibernate映射类

java - 如何从 void 方法显示数组?

java - Gradle 在没有主类的情况下构建 Spring Boot 库

Android - 更改 fragment 容器

database - 由于这种模式,在同一个结构中使用事务和简单的数据库连接我该怎么办?

mysql - Django 1.7 中的 transaction.autocommit