【问题标题】:How to open an entity manager after a close(); JAVA EE如何在 close() 后打开实体管理器; JAVA EE
【发布时间】:2016-04-13 14:18:26
【问题描述】:

我正在开发一个在我的 dao 类中注入实体管理器的类 但是当我关闭实体管理器时,我无法再次打开它

这是课

public class EMinjector {

public static EntityManagerFactory eMF;
public static EntityManager eM;

static {
    eMF = Persistence.createEntityManagerFactory("persistenceUnit");
    eM = eMF.createEntityManager();
}

public static EntityManager getEM(){
    if (eM.getTransaction().isActive()==false)
        //here where I want to open eM
    return eM;
}

public static void closeEM() {
    eM.getTransaction().commit();
    eM.close();
}
}

我试过 eM.getTransaction().begin();但它抛出了这个异常:

Stacktraces

java.lang.IllegalStateException: EntityManager is closed 
org.hibernate.jpa.internal.EntityManagerImpl.checkOpen(EntityManagerImpl.java:97)
org.hibernate.jpa.internal.EntityManagerImpl.checkOpen(EntityManagerImpl.java:88)
org.hibernate.jpa.internal.EntityManagerImpl.getSession(EntityManagerImpl.java:103)
org.hibernate.jpa.internal.TransactionImpl.getSession(TransactionImpl.java:35)
org.hibernate.jpa.internal.TransactionImpl.begin(TransactionImpl.java:45)
com.iticsys.GBO.dao.EMinjector.getEM(EMinjector.java:21)

// line 21 is where I pointed before

【问题讨论】:

  • 你的代码告诉你如何创建一个EntityManager eM = eMF.createEntityManager();
  • 我不想在每次做交易时都创建一个实体管理器,而是只想创建一个并在交易前打开它,然后再关闭它。
  • 创建一个 EM 就是打开一个 EM!
  • 哦,谢谢伙计 :)

标签: hibernate jpa jakarta-ee entitymanager


【解决方案1】:

在 JavaEE 环境中,您不应使用 RESOURCE_LOCAL,而应使用 JTA。您可以使用 @PersistenceContext 注入 EntityManager,并且由于 EJB 已经是事务性的,因此您不必提交、关闭等。

对于上面示例中的 RESOURCE_LOCAL EntityManager,您不能重复使用已关闭的 EntityManager,但必须使用工厂创建一个新的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 2023-03-13
    • 2015-05-05
    • 2019-08-25
    • 2020-09-18
    • 2013-02-20
    • 2018-03-26
    • 1970-01-01
    相关资源
    最近更新 更多