我是EJB和hibernate的新手,以下让我感到困惑,因为每当我寻找明确的答案时似乎都会有矛盾。 问题:
以下列方式将实体管理器直接注入无状态bean是否是线程安全的?
@Stateless
public class SomeBean implements SomeInterface {
//..
@Inject
private EntityManager entityManager;
//... non related transaction1()
//... non related transaction2()
每个无状态bean是否都有自己的EntityManager
实例,或者可以注入共享实例?
根据Hibernate文档:
EntityManager
是一个廉价的,非线程安全的对象,应该只使用一次,用于单个业务流程,单个工作单元,然后丢弃。
EJB容器是否使其成为线程安全的?
根据EJB文档,无状态会话bean本身就是线程安全的,因为不允许不同的客户端同时在同一个bean上运行。
但是,我已经阅读了应该注入EntityManagerFactory
而不是EntityManager
的示例,如果直接注入EntityManager
,则应该在有状态bean中完成。
如上所示,总是将EJB直接注入无状态bean,或者当它不起作用时会有什么用例,是否安全?
答案 0 :(得分:7)
每个无状态bean是否都有自己的EntityManager实例或共享实例可以注入?
两者都不是。 @Inject
(以及@PersistenceContext
和@EJB
)会注入代理实例,而非实际实例。
代理将在每个方法调用委托给当前线程和上下文中的正确可用实例。换句话说,容器担心这一切,而不是你。