【问题标题】:How to manage EntityManager/Session in JSF?如何在 JSF 中管理 EntityManager/Session?
【发布时间】:2013-12-26 18:51:01
【问题描述】:

我有一个 JSF 应用程序在 tomcat 上运行,使用休眠。 直到现在,每次我需要一个 EntityManager 来做一些思考,例如。一些选择查询,我正在打开连接,然后进行查询,然后关闭它。 昨天我发现正确的方法是开始一个事务,然后进行查询,最后提交或回滚事务(即使它是只读语句)。 所以,今天我花了大部分时间跟踪 EntityManager 的每一次出现,并更改代码以在需要它们的地方包含开始和提交。

有没有办法让 EntityManager 打开/关闭/提交操作对开发人员隐藏,例如,当一些请求开始时,EntityManager 被打开,当请求完成时,它会自动关闭......这样的事情,所以它减少了分心的开发人员犯错的机会?

【问题讨论】:

    标签: java hibernate tomcat


    【解决方案1】:

    您可以创建一个基础抽象类来为您完成基础工作,而子类只实现特定的东西。问题是您最终需要将许多方法包含在基类机制中。

    另一种方法是使用泛型模板来实现它,在实现过程中您将只放置细节。

    更深奥的方法是使用 AOP 来拦截调用并为代码运行准备环境。

    干杯

    【讨论】:

    • 但是那样的话,我需要创建匿名类,问题是局部变量会有很多“final”关键字,我个人不喜欢这种方法...我认为会有更好的方法,tomcat本身可以管理...
    • @MateusViccari 如果您将 EJB 3.x 与 JavaEE 容器一起使用,那么它将为您管理;)但我不知道这是否是一个选项,因为您提到了 Tomcat。
    • Spring 的 JpaTemplate 也有帮助。
    【解决方案2】:

    Spring 的 OpenEntityManagerInViewFilter(如果您使用的是 Hibernate API 而不是 JPA API,则为 OpenSessionInViewFilter)做您需要的事情。

    您将过滤器添加到您的 web.xml,并在 Spring 上下文中将 EntityManagerFactory 定义为 bean,现在在每个通过过滤器的 HttpServletRequest 中创建并打开一个新的 EntityManager,并在请求处理后将其关闭。

    您可以使用 Spring Transaction API 进行事务管理。如果您在一个事务中同时执行 JPA、Hibernate 和 JDBC 查询,Spring 会保留一个事务。

    【讨论】:

      【解决方案3】:

      在 Java EE 版本 5 或更高版本中,假设您正在使用应用服务器的 JPA 实现,您可以通过使用 @Resource 注释私有字段来注入 EntityManager,然后该 EM 将由应用服务器管理。

      如果您使用的是 Spring,如果您使用的是 Spring 管理的事务,并且这些事务已正确配置,则此功能可用。 There is another Stackoverflow question 可用,这是widely covered in the Spring documentation

      【讨论】:

        猜你喜欢
        • 2016-02-29
        • 1970-01-01
        • 2016-08-22
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 2019-02-12
        相关资源
        最近更新 更多