在EJB Helper类中查找实体管理器

时间:2011-01-26 09:02:04

标签: java jpa transactions ejb-3.0

我试图在一些辅助类中注入实体管理器,我可以从会话bean将它传递给帮助器,但问题是我需要在辅助类的静态init块中使用实体管理器(有些东西)等):

class MySessionBeanHelperClass
{
 // staff here...


    static
 {
  SomeClass s = new SomeClass(entityManager);
 }
}

所以,我认为唯一的方法是查找实体管理器而不是注入它。并且使用传递的SessionContent在这里不起作用。 (是????)(这是第一个问题)

第二个问题是: 如果我使用普通方式查找资源(在本例中为实体管理器)(如下所示:)

Context ic = new InitialContext(); 
em = (EntityManager) ic.lookup("java:comp/env/persistence/em"); 

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

谢谢!

2 个答案:

答案 0 :(得分:1)

回答第二个问题,

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

答案 1 :(得分:1)

我不认为从静态初始化器中做到这一点是个好主意。您必须确保在查找发生之前所有必需的服务(例如JNDI,JPA)都已启动,但是当您从静态初始化程序执行此操作时,无法保证。

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

How to perform a DB cleanup operation upon shutdown in an EJB container

该示例适用于在app上执行操作。停止,但您可以改为覆盖Servlet#init