Java 如何在Play2.5中使用JPA而不为我的每个不同调用创建entitymanager工厂?

Java 如何在Play2.5中使用JPA而不为我的每个不同调用创建entitymanager工厂?,java,hibernate,jpa,playframework,entitymanager,Java,Hibernate,Jpa,Playframework,Entitymanager,我正在使用Play2.5为Oracle数据库开发一个API。现在我正在尝试使用JPA的内置功能。在这一刻,我得到了错误 没有绑定到此线程的EntityManager。请尝试在JPAApi.withTransaction中包装此调用,或确保在此线程上设置了HTTP上下文 . 这是负责实际调用的代码 package actors.protocols; import akka.japi.Option; import model.DTO.AanleverAfspraakVO; import model

我正在使用Play2.5为Oracle数据库开发一个API。现在我正在尝试使用JPA的内置功能。在这一刻,我得到了错误 没有绑定到此线程的EntityManager。请尝试在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;}
  }
}
package-actors.protocols;
进口akka.japi.Option;
导入model.DTO.AanleverAfspraakVO;
导入model.domain.AanleverAfspraakDO;
导入play.db.jpa.jpa;
导入play.db.jpa.Transactional;
导入javax.persistence.EntityManager;
导入javax.persistence.Query;
导入java.util.Collection;
公共类aanleverafsrakactorprotocol实现该协议{
公共静态类GetAanleverAfspraakByID{
私有int-id;
公共GetAanleverAfspraakByID(int-id){
this.id=id;
}
/**
*通过id获取AanleverAfspraak
*@return AanleverAfspraakVO或null
*/
@交易的
公共选项getAanleverAfspraakById(){
final EntityManager EntityManager=JPA.em().GetEntityManager工厂().createEntityManager();
final Query Query=entityManager.createNamedQuery(“findbyid”);
query.setParameter(“id”,id);
最终收集结果集=query.getResultList();
最终选项响应;
选项响应_值=选项。无();
System.err.println(“大小:+resultset.Size());
如果(!resultset.isEmpty()){
试一试{
AanleverAfspraakDO AanleverAfspraakDO=resultset.iterator().next();
response_value=Option.some(这个.convertAanleverAfspraakBOToVO(aanleverAfspraakDO));
}捕获(例外e){
响应_值=选项。无();
e、 printStackTrace();
}
最后{
试一试{
entityManager.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}
响应=响应值;
返回响应;
}
/**
*将AanleverAfspraakBO转换为AanleverAfspraakVO
*@param aanleverAfspraakDO
*@返回
*@抛出NullPointerException
*/
私有AanleverAfspraakVO转换器aanleverafspraakbotovo(AanleverAfspraakDO AanleverAfspraakDO)抛出NullPointerException{
if(aanleverAfspraakDO==null){
抛出新的NullPointerException(“aanleverAfspraakDO为null”);
}
最终AanleverAfspraakVO AanleverAfspraakVO=新AanleverAfspraakVO();
aanleverAfspraakVO.setId(aanleverAfspraakDO.getId());
aanleverAfspraakVO.setOmschrijving(aanleverAfspraakDO.getOmschrijving());
aanleverAfspraakVO.setingangsdatam(aanleverAfspraakDO.getingangsdatam());
aanleverAfspraakVO.setEindDatum(aanleverAfspraakDO.getEinddatum());
返回安勒维拉夫斯普拉克沃;
}
public int getId(){return id;}
}
}

有人能给我解释一下我如何在JPA通话中使用play的构建功能吗

您不应该创建EntityManager。游戏就是这样做的

因此,在游戏2.4和更早的版本中,这应该是可行的:

final EntityManager entityManager = JPA.em().createNamedQuery("findbyid");
JPA.em()
提供此线程的默认EntityManager()

从上的Play 2.4可以注入Play的JPAApi,尽管JPA仍然可以正常工作:

@Inject
public MyClass(JPAApi api) {
  this.jpaApi = api;
}

然后
jpaApi.em()
()

谢谢大家的帮助,但我刚才已经解决了这个问题。我在交易中使用了以下代码

@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();
@Transactional
公共选项执行任务(){
最终选项响应=api.withTransaction(()->{
final Query Query=api.em().createNamedQuery(“findbyid”).setParameter(“id”,id);
最终收集结果集=query.getResultList();

变量api是JPAApi的一个实例

没有看到您使用Play 2.5。因此建议选择JPAApi(就像您可能已经想到的那样)。