2009-12-27 86 views
2

当使用EntityManager时,最好是在PersistenceContext之间获得一个实例并在我的程序中传递它,或者是否应该多次使用依赖注入?EntityManager初始化最佳实践

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

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

回答

2

是的,你应该注入EntityManager情况下(这将是为每个线程/客户端请求不同)为您的有状态会话Bean(这是不是同时调用,至少不是来自不同的客户)。

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

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

+0

感谢您的回答。所以我的有状态bean应该有一个'EntityManager'属性,并通过参数传递给任何其他访问数据库的对象? – 2009-12-28 19:24:32

+1

是的,如果需要的话。但是,在使用EJB时​​,最好只从会话bean本身(无状态或有状态)访问EntityManager API;那么你永远不需要传递EntityManager实例。当然,其他类型的托管bean(如MDB)也可以做同样的事情。 – 2009-12-29 02:15:13

3

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

+0

感谢您的回答。为什么DAO应该是一个无状态bean? – 2009-12-28 19:29:29

+0

它不需要一个状态。应该存储什么? – Bozho 2009-12-28 19:50:13