当前位置: 首页 > 面试题库 >

从无状态Bean获取JDBC Connection对象

仰欣悦
2023-03-14
问题内容

在无状态会话Bean中,EntityManager注入了一个Connection对象,但是我想获得一个对象以调用DB过程。有什么解决办法吗?


问题答案:

这将是JPA提供程序特定的代码。通常,这是通过unwrap()EntityManager类上调用来完成的。

如果您使用的是EclipseLink,则以下代码(来自EclipseLink
Wiki
)将非常有用(在使用应用程序管理的EntityManager的情况下):

JPA 2.0

entityManager.getTransaction().begin();
java.sql.Connection connection = entityManager.unwrap(java.sql.Connection.class); // unwraps the Connection class.
...
entityManager.getTransaction().commit();

JPA 1.0

entityManager.getTransaction().begin();
UnitOfWork unitOfWork = (UnitOfWork)((JpaEntityManager)entityManager.getDelegate()).getActiveSession();
unitOfWork.beginEarlyTransaction();
Accessor accessor = unitOfWork.getAccessor();
accessor.incrementCallCount(unitOfWork.getParent());
accessor.decrementCallCount();
java.sql.Connection connection = accessor.getConnection();
...
entityManager.getTransaction().commit();

注意,为JPA 2.0提供的解决方案将在Hibernate 3.6.5中失败,并带有一条PersistenceException消息

Hibernate无法解包接口java.sql.Connection

使用Skaffman提供的代码使它与Hibernate兼容(即使对于容器管理的持久性上下文,也已验证可在3.6.5下使用)。

但是,EclipseLink Wiki指出了一些有用的信息-
如果您正在使用JTA托管的数据源,则应该使用@Resource注释注入它,或者使用JNDI查找来获取它。只要您需要对数据库执行事务性工作,那么对于从数据源获取新连接还是从现有数据源获取新连接就无关紧要。无论如何,大多数连接池将提供与当前线程关联的相同连接(即,实体管理器已使用的连接)。因此,您将避免这种方式解开实体管理器,并避免对数据库执行事务性活动。请记住,如果执行此操作,则持久性上下文缓存和二级缓存可能不会同步。



 类似资料:
  • 无状态会话bean是一种企业bean,通常用于执行独立操作。 无状态会话bean根据其名称没有任何关联的客户端状态,但它可以保留其实例状态。 EJB容器通常会创建一个包含少量无状态bean对象的池,并使用这些对象来处理客户端的请求。 由于池,在查找/方法调用中不保证实例变量值相同。 创建无状态EJB的步骤 以下是创建无状态EJB所需的步骤 - 创建公开业务方法的远程/本地接口。 EJB客户端应用程

  • 我是EJB的新手,最近开始研究EJB(3.0)。我已经使用Java6年了,但以前从未使用过EJB。至少可以说,整个EJB业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。 在理解无状态会话bean后,我想到的一个问题是,你能不能不要总是用一个没有本地成员的类的共享实例来替换无状态会话bean(实际上使其无状态)?我了解到正在为无状态会话bean进行实例池。如果没有状态,就不能简单地使

  • 问题内容: 我有一个有状态会话Bean(SFSB),它用作身份验证模块。在SFSB中,我存储了登录的当前用户。此外,我还有一些外观(用于处理我的实体的JPA / SQL内容)(无状态会话Bean(SLSB))。为了检查当前用户的访问权限,我尝试从SLSB中调用SFSB。但是,从SLSB调用时,当前用户字段始终为“空”。直接调用SFSB时,当前用户字段设置正确…对于调用,我使用@EJB批注。 任何想

  • 问题内容: 我正在阅读Java EE 6教程,试图理解无状态会话bean和有状态会话bean之间的区别。如果无状态会话bean在方法调用之间没有保持其状态,为什么我的程序按原样运行? 客户端 我原本希望getNumber每次都返回0,但它返回1,并且在浏览器中重新加载servlet会使它更多。问题在于我对无状态会话Bean如何工作的理解,而与库或应用程序服务器无关。有人可以给我一个无状态会话bea

  • 问题内容: 我如何获得的?通过我的意思是得到它是否有一个复选标记与否。 问题答案: 创建它时,它需要一个关键字参数。从传递。选中或取消选中该框会将包含的值设置为相应的布尔状态。可以通过以下方式访问: 已检查=> 未检查=>

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该