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生命周期?
任何帮助赞赏.
TransactionManager负责管理Spring Framework中的事务边界.当您使用方法注释业务方法时,@Transactional正在使用方面检测方法.在执行方法之前,此方面与TransactionManager交互,后者决定是否有必要创建新事务或使用预先存在的事务.在创建新事务的情况下,从EntityManagerFactory创建新的实体管理器,并且该事务管理器与事务的当前线程相关联.
EntityManager负责迭代数据库.当你注入它时@PersistenceContext,Spring会向EntityManager注入一个代理.每当在EntityManager代理中执行操作时,它都会查找与该线程关联的EntityManager.
| 归档时间: |
|
| 查看次数: |
2803 次 |
| 最近记录: |