Spring JPA。没有可用的事务性EntityManager
我正在使用JPA(Hibernate4供应商)和Spring3.2.x。 我使用此代码获取会话并重新连接分离的实体Spring JPA。没有可用的事务性EntityManager,spring,hibernate,jpa,entitymanager,Spring,Hibernate,Jpa,Entitymanager,我正在使用JPA(Hibernate4供应商)和Spring3.2.x。 我使用此代码获取会话并重新连接分离的实体 Session session = entityManager.unwrap(Session.class); 我的代码如下所示: @Service public class SchedulerServiceImpl implements SchedulerService { @PersistenceContext private EntityManager ent
Session session = entityManager.unwrap(Session.class);
我的代码如下所示:
@Service
public class SchedulerServiceImpl implements SchedulerService {
@PersistenceContext
private EntityManager entityManager;
@Override
@Transactional
@Scheduled(fixedDelay = 5000)
public void executeTasks() {
.. code ..
while (tasksIterator.hasNext()) {
SchedulerTask readyTask = recalculation(currentTask);
}
.. code ...
}
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public Deposit recalculation(SchedulerTask schedulerTask) {
boolean asda = entityManager.isOpen(); // get TRUE
Session session = entityManager.unwrap(Session.class); // Exception here
session.update(schedulerTask);
... code ...
}
}
怎么了
错误:
00:21:52,180 ERROR [org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler]
(pool-10-thread-1) Unexpected error occurred in scheduled task.:
java.lang.IllegalStateException: No transactional EntityManager
available
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invokeSharedEntityManagerCreator.java:224)
[spring-orm-3.2.4.RELEASE.jar:3.2.4.RELEASE]
at com.sun.proxy.$Proxy36.unwrap(Unknown Source)
at com.jar.dom.service.SchedulerServiceImpl.recalculation(SchedulerServiceImpl.java:133)
[classes:]
at com.jar.dom.service.SchedulerServiceImpl.executeTasks(SchedulerServiceImpl.java:92)
[classes:]
试试这个
@Override
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public Deposit recalculation(SchedulerTask schedulerTask) {
entityManager = entityManager.getEntityManagerFactory().createEntityManager();
Session session = entityManager.unwrap(Session.class);
session.update(schedulerTask);
... code ...
}
我解决了这个问题,在spring配置中添加了这行代码
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories("com.blablabla")
class ApplicationConfig {
....
}
如果我在另一个类中移动重新计算方法,所有的工作都很好,但是为什么呢?看看这里:这是潜在的危险,因为这将在spring的范围之外创建一个新的
EntityManager
,因此您需要添加对它的管理。更不用说它在多线程环境中设置了一个实例变量。正如M.Deinum所说,它会泄漏连接。