【问题标题】:EntityManager initialization best practicesEntityManager 初始化最佳实践
【发布时间】:2010-12-30 07:55:20
【问题描述】:

当使用EntityManager 时,最好是使用PersistenceContext 获取一个实例并在我的程序中传递它,还是应该多次使用依赖注入?

在我的应用程序中,每个客户端都将与一个有状态会话 bean 进行通信,并且每个 bean 在某些时候都需要使用EntityManager。 我猜想同时调用 bean 方法(但我什至不确定)。 如何保证以线程安全的方式使用EntityManager?有交易吗?每个 bean 中都有一个单独的实例?

对不起,如果这令人困惑,我是 EJB/JPA 的新手,我找不到任何材料可以解决我的问题。

【问题讨论】:

    标签: java jpa entitymanager


    【解决方案1】:

    使用@PersistenceContextEntityManager 注入到您的DAO 类中。这些是处理数据库操作的类。然后在所有其他(服务)类中注入您的 DAO 类。你的 DAO 应该是一个无状态的 bean(不需要远程接口,只有本地)

    【讨论】:

    • 感谢您的回答。为什么 DAO 应该是无状态 bean?
    • 它不需要状态。里面应该存放什么?
    【解决方案2】:

    是的,您应该将 EntityManager 实例(对于每个线程/客户端请求都不同)注入到您的有状态会话 bean(不会同时调用,至少不会从不同的客户端调用)。

    但是,创建 DAO 类是没有意义的。 JPA 已经是一个高级持久性 API,它为您提供 RDBMS 独立性和不同 JPA 实现之间的可移植性。因此,DAO 只会给代码库增加混乱。

    对于交易,您实际上不需要做任何事情。默认情况下,会话 bean 中的业务方法具有“必需”事务属性,因此它们将始终在特定于客户端的事务中运行。

    【讨论】:

    • 感谢您的回答。所以我的有状态bean应该有一个EntityManager属性,并通过参数将它传递给任何其他将访问数据库的对象?
    • 是的,如果需要的话。但是在使用 EJB 时,最好只从会话 bean 本身(无状态或有状态)访问 EntityManager API;那么您将永远不需要传递 EntityManager 实例。当然,其他类型的托管 bean(如 MDB)也可以这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多