java - 如何在 play 2.5 中使用 JPA,而不为每个不同的调用创建实体管理器工厂?

标签 java hibernate jpa playframework entitymanager

我正在为 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/

相关文章:

hibernate - java.lang.NoSuchMethodError : org. hibernate .cfg.Environment.verifyProperties

java - 事务注释在 Spring Boot 中不起作用

java - 如何克服 "java.sql.SQLException: Too many connections"异常?

java - 错误 HTTP : 500 when uploading/sharing file in openmeetings

java - 查询我的 JPA 提供程序 (Hibernate) 以获取实体的 <Id,Name> 集合

java - 如何映射包含多对多的可嵌入对象

hibernate - 两个外键作为主键

java - hibernate 。多对多。双向关联。楼主是什么意思?

java - 如何在执行另一个测试后立即执行另一个测试?

javascript - GWT Java - 如何关闭窗口(注销)