Java 在EJB帮助器类中查找实体管理器

Java 在EJB帮助器类中查找实体管理器,java,jpa,transactions,ejb-3.0,Java,Jpa,Transactions,Ejb 3.0,我试图在某个助手类中注入实体管理器,我可以从会话bean将其传递给助手,但问题是我需要在助手类的静态init块中使用实体管理器(类似于: 因此,我认为唯一的方法是查找实体管理器,而不是注入它。而且使用通过的SessionContent在这里也不起作用。(是不是??)(这是第一个问题) 第二个问题是: 如果我使用普通方式查找资源(在本例中是实体管理器)(类似于以下内容:) 这是否会将此实体管理器使用的所有事务转换为Bean管理的事务 谢谢 回答第二个问题,否 第一个问题,这不是一个好主意。顺便说一

我试图在某个助手类中注入实体管理器,我可以从会话bean将其传递给助手,但问题是我需要在助手类的静态init块中使用实体管理器(类似于:

因此,我认为唯一的方法是查找实体管理器,而不是注入它。而且使用通过的SessionContent在这里也不起作用。(是不是??)(这是第一个问题)

第二个问题是: 如果我使用普通方式查找资源(在本例中是实体管理器)(类似于以下内容:)

这是否会将此实体管理器使用的所有事务转换为Bean管理的事务


谢谢

回答第二个问题,


第一个问题,这不是一个好主意。顺便说一句,你在忙什么?如果您的helper类中需要
EntityManager
,最好将其设置为私有实例级变量,并使用helper类构造函数从会话bean传递该变量。

我认为从静态初始值设定项执行该操作不是一个好主意。您必须确保所有必要的服务(如JNDI、JPA)在查找发生之前都已启动,但您不能保证在使用静态初始值设定项进行查找时会启动这些服务

EJB中的一个已知问题是,在应用程序上没有执行一次性任务的“标准”方式。开始/停止,但您可以在以下链接中使用技巧:


该示例用于对应用程序执行操作。停止,但您可以替代
Servlet#init

“EJB中有一个已知的问题,即没有“标准”的方法在应用程序上执行一次性任务”-这不是真的@在EJB3.1中,Singleton与@Startup的结合正好做到了这一点。由于TS表示他正在使用EJB3.0,很遗憾这不是他的选择。@arjan:哦,所以他们在3.1中修复了它?好!!谢谢:),我只是想从一些类(非ejb)中创建静态实例,而不是每次客户端发出请求时都创建实例。@Mohammed:
EntityManager
不是ejb,您的理解是正确的。但它仍然是一个托管对象,您不知道容器是否以及何时实例化它。当我们注入它时,这仅仅意味着查找的替代方法。所以,我的建议应该行得通。
class MySessionBeanHelperClass
{
 // staff here...


    static
 {
  SomeClass s = new SomeClass(entityManager);
 }
}
Context ic = new InitialContext(); 
em = (EntityManager) ic.lookup("java:comp/env/persistence/em");