我试图在一些辅助类中注入实体管理器,我可以从会话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管理的事务吗?
谢谢!
答案 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
。