2016-08-23 121 views
0

我有异步的Web服务方法,我想发送responce 202(接受),并做与数据库相同的更改。我如何使用JPA实现它? 这里我服务的方法:异步的Web服务JPA

@Transactional 
public void createTask(@Suspended AsyncResponse response){ 
    new Thread(){ 
     public void run(){ 
      RequestTask requestTask = new RequestTask(); 
      requestTask.setAim("all tables"); 
      requestTask.setDescription("Update Tables"); 
      requestTask.setOwner("John Calagan"); 

      requestTaskDao.createRequestTask(requestTask); 
     } 

    }.start(); 

    Response acceptedResponse = Response.status(Response.Status.ACCEPTED).build(); 
    response.resume(acceptedResponse); 
} 

吾道级别:

@PersistenceContext(unitName = "administration") 
private EntityManager entityManager; 

@Override 
public void createRequestTask(RequestTask requestTask) { 
    entityManager.persist(requestTask); 
} 

但我有一个例外:

Exception in thread "Thread-6" javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityMa nagerInvocationHandler.invoke(SharedEntityManagerCreator.java:282) at com.sun.proxy.$Proxy33.persist(Unknown Source) at... 

我怎样才能解决这个问题呢?

+0

忘了说我在课堂上注释@Transactional – Vas9IH

+0

你可以编辑你的问题。 – talex

+0

谢谢,我没有注意到 – Vas9IH

回答

0

您应该将run中的所有实际代码移动到Transactional注释中,将类和标记方法分开。它迫使Spring做它的运行时魔术。

然后注入这个servise类到你的并称之为。 PS:将代码移动到未命名类的新方法将无济于事。

+0

我试过了,但是没有解决问题 – Vas9IH

+0

对不起。我忘了'春天'如何神奇。 – talex