EntityManager初始化最佳实践
使用 EntityManager 时,最好使用 PersistenceContext 获取一个实例并将其在我的程序中传递,还是应该多次使用依赖项注入?
在我的应用程序中,每个客户端都将与有状态会话 bean 进行通信,并且每个 bean 在某个时刻都需要使用 EntityManager。 我猜想 bean 方法是同时调用的(但我什至不确定)。 如何保证以线程安全的方式使用 EntityManager?有交易吗?每个 bean 都有一个单独的实例?
抱歉,如果这令人困惑,我是 EJB/JPA 的新手,我找不到任何可以解决我的问题的材料。
When using EntityManager
, is it better to get one instance with PersistenceContext
and pass it around in my program, or should I use dependency injection more than once?
In my application each client will communicate with a stateful session bean, and each bean needs to use EntityManager
at some point.
I guess that bean methods are invocated concurrently (but I'm not even sure).
How do I guarantee that I use EntityManager
in a thread-safe manner? With transactions? With a separate instance in each bean?
Sorry if this is confusing, I'm new to EJB/JPA and I couldn't find any material which addresses my questions.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是的,您应该将 EntityManager 实例(对于每个线程/客户端请求都不同)注入到有状态会话 bean(不会同时调用,至少不会从不同的客户端调用)。
不过,创建 DAO 类是没有意义的。 JPA 已经是一个高级持久性 API,它为您提供 RDBMS 独立性以及不同 JPA 实现之间的可移植性。因此,DAO 只会给代码库带来混乱。
对于交易,您实际上不需要执行任何操作。默认情况下,会话 bean 中的业务方法具有“必需”事务属性,因此它们将始终在特定于客户端的事务内运行。
Yes, you should inject the
EntityManager
instances (which will be different for each thread/client request) into your stateful session beans (which are not invoked concurrently, at least not from different clients).There is no point in creating DAO classes, though. JPA already is a high-level persistence API that gives you RDBMS independence and portability between different JPA implementations. So, DAOs would only add clutter to the codebase.
For transactions, you don't really need to do anything. Business methods in session beans have a "Required" transaction attribute by default, so they will always run inside a client-specific transaction.
使用 @PersistenceContext 将
EntityManager
注入 DAO 类中。这些是将处理数据库操作的类。然后在所有其他(服务)类中注入您的 DAO 类。您的 DAO 应该是无状态 bean(不需要远程接口,只需本地接口)Use
@PersistenceContext
to inject yourEntityManager
in your DAO class(es). These are the classes that will handle the database operations. Then in all other (service) classes inject your DAO class(es). Your DAO should be a stateless bean (no need of a remote interface, only local)