gpt4 book ai didi

java - Spring 事务,EntityManager 生命周期

转载 作者:搜寻专家 更新时间:2023-10-31 19:27:38 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com