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