【问题标题】:looking up entity manager in EJB Helper classes在 EJB Helper 类中查找实体管理器
【发布时间】:2011-01-26 09:02:04
【问题描述】:

我试图在一些帮助类中注入实体管理器,我可以将它从会话 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 管理的事务??

谢谢!

【问题讨论】:

    标签: java jpa transactions ejb-3.0


    【解决方案1】:

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

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

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

    该示例用于对应用执行操作。停止,但您可以改写Servlet#init

    【讨论】:

    • 'EJB 中的一个已知问题是没有“标准”方式在应用程序上执行一次性任务' - 这不是真的。 @Singleton 与 @Startup 结合在 EJB 3.1 中正是这样做的。由于 TS 表明他正在使用 EJB 3.0,因此很遗憾这不是他的选择。
    • @arjan:哦,所以他们在 3.1 中修复了它?好!
    【解决方案2】:

    回答你的第二个问题,

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

    【讨论】:

    • 谢谢 :),我只是想从某些类(非 ejb)中创建静态实例,而不是每次来自客户端的请求时创建实例。
    • @Mohammed:EntityManager 不是 EJB,你的理解是正确的。但它仍然是一个托管对象,你不知道容器是否以及何时实例化它。当我们注入它时,这仅仅意味着查找的替代方法。所以,我的建议应该没问题。
    猜你喜欢
    • 2013-01-26
    • 2019-04-30
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2014-09-13
    • 2018-07-17
    • 2017-08-22
    相关资源
    最近更新 更多