Spring Data JPA中EntityManager的绑定对象及生命周期相关问题
Spring Data JPA中EntityManager的绑定逻辑与生命周期
EntityManager绑定到线程还是事务?
Spring Data JPA里,EntityManager本质是绑定到当前事务的,底层通过ThreadLocal机制实现线程内的事务级绑定:同一个线程内的同一个事务会共享一个EntityManager,但如果线程内开启多个独立事务,每个事务都会拥有专属的EntityManager。
频繁调用@Transactional方法时,EntityManager是否会被复用?
分两种场景:
- 如果多次调用处于同一个事务上下文(比如外层方法已标记
@Transactional,内层调用的方法默认使用propagation=REQUIRED传播行为,会加入外层事务),那么所有调用会复用同一个EntityManager。 - 如果每次调用都是独立事务(比如使用
propagation=REQUIRES_NEW传播行为,或者外层无事务上下文),那么每次调用都会创建新的EntityManager。
事务提交后EntityManager的状态变化?
事务提交完成后,对应的EntityManager会被关闭并归还到EntityManagerFactory的连接池(Spring默认使用容器管理的EntityManager)。此时EntityManager不再持有持久化上下文,之前管理的实体都会转为游离(detached)状态,后续若要操作这些实体,需要重新合并(merge)到新的EntityManager上下文中。
内容的提问来源于stack exchange,提问作者user1409534
相关产品推荐
相关产品推荐

