Spring事务,EntityManager生命周期

Yoh*_*xFF 5 java spring transactions entitymanager

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

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码正常工作.我无法理解的一件事是,当EntityManager仅在UserDao类中注入时,UserService bean的aop代理如何启动事务.有人可以解释一下这是如何工作的以及Spring框架如何管理EntityManager生命周期?

任何帮助赞赏.

Mar*_*iti 9

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

EntityManager负责迭代数据库.当你注入它时@PersistenceContext,Spring会向EntityManager注入一个代理.每当在EntityManager代理中执行操作时,它都会查找与该线程关联的EntityManager.

  • 详细说明请参见 https://dzone.com/articles/how-does-spring-transactional (4认同)