Java EntityManager变为空

Java EntityManager变为空,java,hibernate,jpa,persistence,Java,Hibernate,Jpa,Persistence,我在使用EntityManager时出现了一个奇怪的错误。下面是代码的摘录 @PersistenceUnit EntityManagerFactory factory; @Resource UserTransaction transaction; EntityManager em; 方法内部: try{ datos.crearDatos(docEntrada); ctx.setDatosMensajes(datos); factory=Persistence.createEntityManag

我在使用EntityManager时出现了一个奇怪的错误。下面是代码的摘录

@PersistenceUnit
EntityManagerFactory factory;
@Resource
UserTransaction transaction;
EntityManager em;
方法内部:

try{
datos.crearDatos(docEntrada);
ctx.setDatosMensajes(datos);
factory=Persistence.createEntityManagerFactory("ealia");
transaction = (UserTransaction)new InitialContext().lookup("java:comp/UserTransaction");
EntityManager em = factory.createEntityManager();

//Do whatever it does, everything works fine.
// HERE THE ENTITY MANAGER IS NOT NULL
}
catch (Exception e){

}
finally{
    // HERE THE ENTITY MANAGER IS NULL 
        try {
            SVCSMensajes.grabarMensajeSalida(datos, Constantes.MENSAJE_SALIDA_WS_USUARIOS_GESTION, Constantes.NOMBRE_SERVICIO_WS_USUARIOS_GESTION, Constantes.MENSAJE_ENTRADA_WS_USUARIOS_GESTION, em, ctx,transaction);
        } catch (CecaException e) {
            // No devolvemos error en este caso
        }

        em.close();
        factory.close();
  }
我不明白为什么eentity manager在finally中变为null,而在尝试结束时不是null,当一切正常时,没有例外。我跟踪变量,它变为null,中间没有中间指令

相反,如果我以这种方式重新排列代码

    factory=Persistence.createEntityManagerFactory("ealia");
    transaction = (UserTransaction)new  InitialContext().lookup("java:comp/UserTransaction");
    EntityManager em = factory.createEntityManager();

    try{
        datos.crearDatos(docEntrada);
        ctx.setDatosMensajes(datos);
    ....
    }
    ....
一切正常。有人能解释一下吗?

您在此处将em声明为try块的局部变量:

EntityManager em = factory.createEntityManager();
该变量对finally块不可见。该块使用您声明为类字段的块

您需要将上述行更改为:

em = factory.createEntityManager();
以初始化字段,而不是局部变量


更好的是,您可能希望注入EntityManager,而不是手动创建它。

Ups,这是一个愚蠢的错误。。。真不敢相信我没看见。顺便说一下,谢谢。没问题。为了避免这种错误,应该使用漂亮的语法着色,使字段、局部变量和方法参数看起来不同。如果它对你有帮助的话,别忘了打勾并投票-