我正在使用 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/