我正在为 Oracle 数据库开发一个带有 play 2.5 的 API。现在我正在尝试使用 JPA 的内置功能。此时我收到错误 “没有 EntityManager 绑定(bind)到该线程。尝试将此调用包装在 JPAApi.withTransaction 中,或者确保在此线程上设置 HTTP 上下文。” 。这是负责实际调用的代码。
package actors.protocols;
import akka.japi.Option;
import model.DTO.AanleverAfspraakVO;
import model.domain.AanleverAfspraakDO;
import play.db.jpa.JPA;
import play.db.jpa.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.Collection;
public class AanleverAfspraakActorProtocol implements Protocol {
public static class GetAanleverAfspraakByID{
private int id;
public GetAanleverAfspraakByID(int id){
this.id = id;
}
/**
* Get AanleverAfspraak by id
* @return AanleverAfspraakVO or null
*/
@Transactional
public Option<AanleverAfspraakVO> getAanleverAfspraakById(){
final EntityManager entityManager = JPA.em().getEntityManagerFactory().createEntityManager();
final Query query = entityManager.createNamedQuery("findbyid");
query.setParameter("id", id);
final Collection<AanleverAfspraakDO> resultset = query.getResultList();
final Option<AanleverAfspraakVO> response;
Option<AanleverAfspraakVO> response_value = Option.none();
System.err.println("Size: " + resultset.size());
if(!resultset.isEmpty()){
try{
AanleverAfspraakDO aanleverAfspraakDO = resultset.iterator().next();
response_value = Option.some(this.convertAanleverAfspraakBOToVO(aanleverAfspraakDO));
}catch(Exception e){
response_value = Option.none();
e.printStackTrace();
}
finally {
try {
entityManager.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
response = response_value;
return response;
}
/**
* Convert AanleverAfspraakBO to AanleverAfspraakVO
* @param aanleverAfspraakDO
* @return
* @throws NullPointerException
*/
private AanleverAfspraakVO convertAanleverAfspraakBOToVO(AanleverAfspraakDO aanleverAfspraakDO) throws NullPointerException {
if(aanleverAfspraakDO == null){
throw new NullPointerException("aanleverAfspraakDO is null");
}
final AanleverAfspraakVO aanleverAfspraakVO = new AanleverAfspraakVO();
aanleverAfspraakVO.setId(aanleverAfspraakDO.getId());
aanleverAfspraakVO.setOmschrijving(aanleverAfspraakDO.getOmschrijving());
aanleverAfspraakVO.setIngangsDatum(aanleverAfspraakDO.getIngangsdatum());
aanleverAfspraakVO.setEindDatum(aanleverAfspraakDO.getEinddatum());
return aanleverAfspraakVO;
}
public int getId(){return id;}
}
}
有人可以向我解释一下如何使用 play 的构建功能来进行 JPA 调用吗?
最佳答案
大家感谢您的帮助,但我刚才已经解决了这个问题。我在交易中使用了以下代码
@Transactional
public Option<AanleverAfspraakDTO> executeTask() {
final Option<AanleverAfspraakDTO> response = api.withTransaction(() -> {
final Query query = api.em().createNamedQuery("findbyid").setParameter("id", id);
final Collection<AanleverAfspraakDO> resultset = query.getResultList();
变量 api 是 JPAApi 的实例
关于java - 如何在 play 2.5 中使用 JPA,而不为每个不同的调用创建实体管理器工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36128211/