我是EJB新手。我想知道EnityManger应该由EJB 3.0中的无状态或有状态会话数自己(em.close()
)关闭(可能在使用@preDestroy
注释的方法中)?是否由ejb容器关闭,释放其资源,我们在检索所需的DB数据后不需要居住EnitityManger?我们应该停止或关闭哪些服务?
答案 0 :(得分:2)
在EJB中通常不需要执行任何操作。
默认情况下,实体管理器是容器管理的,其关联的持久性上下文是事务范围。这意味着无需创建或关闭实体管理器,也无需开始,提交或回滚任何内容。
在启动事务的方法(透明地发生)完成之后,保证事务范围的持久化上下文被刷新(所有未完成的更新都写入数据库)并清理(L1缓存被销毁)以及与该实体经理有关的任何其他资源。
标准示例:
@Stateless
public class CustomerService {
@PersistenceContext
private EntityManager entityManager;
public void addCustomer(Customer customer) {
entityManager.persist(customer);
}
}
请注意,如果您真的想要,可以通过注入工厂并从中获取实体管理器来使用应用程序管理的实体管理器。在那种情况下,你确实需要自己做任何关闭。如果你还要将它与bean托管事务和扩展持久化上下文结合起来,那么即使在EJB中你也需要自己完成所有事情。但这种情况非常罕见,仅作为一种选择提供给您。这不是默认设置。