Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
eMedTable websphere容器中的Hibernate找不到java:comp/websphere/ExtendedJTATransaction_Java_Hibernate_Junit_Websphere_Embeddable - Fatal编程技术网

eMedTable websphere容器中的Hibernate找不到java:comp/websphere/ExtendedJTATransaction

eMedTable websphere容器中的Hibernate找不到java:comp/websphere/ExtendedJTATransaction,java,hibernate,junit,websphere,embeddable,Java,Hibernate,Junit,Websphere,Embeddable,我有一个JavaEE应用程序,它使用Hibernate4.2.7作为持久性提供者,在可嵌入的WebSphere8.0.0容器中执行Junit测试。数据库访问在真实(即非嵌入式)WebSphere8.0.0实例中运行良好。当使用OpenJPA而不是Hibernate运行时,单元测试确实可以工作。但是,使用Hibernate运行Junit测试时,出现以下异常: CNTR0020E: EJB threw an unexpected (non-declared) exception during inv

我有一个JavaEE应用程序,它使用Hibernate4.2.7作为持久性提供者,在可嵌入的WebSphere8.0.0容器中执行Junit测试。数据库访问在真实(即非嵌入式)WebSphere8.0.0实例中运行良好。当使用OpenJPA而不是Hibernate运行时,单元测试确实可以工作。但是,使用Hibernate运行Junit测试时,出现以下异常:

CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "getEntity" on bean "BeanId(embeddable#classes#SomeBean, null)". Exception data: org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [java:comp/websphere/ExtendedJTATransaction] at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:68) at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter$TransactionAdapter.(WebSphereExtendedJtaPlatform.java:156) at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter$TransactionAdapter.(WebSphereExtendedJtaPlatform.java:152) at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.getTransaction(WebSphereExtendedJtaPlatform.java:124) at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.getStatus(WebSphereExtendedJtaPlatform.java:119) at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:73) at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:115) at org.hibernate.service.jta.platform.internal.TransactionManagerBasedSynchronizationStrategy.canRegisterSynchronization(TransactionManagerBasedSynchronizationStrategy.java:56) ... stripped ... 类ExtendedJtaTransaction本身确实存在于com.ibm.ws.runtime.jar内的类路径上

persistence.xml中的设置如下所示:


org.hibernate.ejb.HibernatePersistence
jdbc/BLA
com.some.Entity
真的

有人能解决这个问题吗?
谢谢

事务策略配置

Hibernate需要配置两个基本部分,以便正确运行事务。第一个类hibernate.transaction.factory_定义事务控制,第二个类hibernate.transaction.manager_lookup_定义事务同步的注册机制,以便在事务结束时通知持久性管理器需要将更改与数据库同步。对于事务控制,支持容器管理的配置和bean管理的配置。将Hibernate与WebSphere Application Server一起使用时,必须在Hibernate.cfg.xml中设置以下属性:

for container-managed transactions:

<property name="hibernate.transaction.factory_class">
    org.hibernate.transaction.CMTTransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
    org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>

for bean-managed transactions:

<property name="hibernate.transaction.factory_class">
    org.hibernate.transaction.JTATransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
    org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>
<property name="jta.UserTransaction">
    java:comp/UserTransaction
</property >
对于容器管理的事务:
org.hibernate.transaction.cmttTransactionFactory
org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
对于bean管理的事务:
org.hibernate.transaction.JTATransactionFactory
org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
java:comp/UserTransaction
UserTransaction属性将工厂类配置为从WebSphere容器获取UserTransaction对象实例的实例


<> P> > WebSphere应用程序服务器V6. x和稍后在WebSphere平台上支持HiBurn.TraceServ.MauleCurrUppUpCype属性,以及WebSphere业务集成服务器基础V5.1和以后的属性。此属性配置Hibernate以使用在WebSphere业务集成服务器基础V5.1和WebSphere Application Server V6.0中介绍的ExtJudJTaTraseAct接口。WebSphere ExtendedJTATransaction接口建立了一个模式,该模式在Java EE 5中通过JTA 1.1规范进行了形式化。

感谢您的回答,但是,如上所述,配置通常运行良好(在非嵌入式WebSphere容器中)。只有嵌入式websphere服务器才会出现此问题。正如您在上面发布的persistence.xml代码片段中所看到的,hibernate.transaction.manager_lookup_类已配置。
<persistence-unit name="BLA" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/BLA</jta-data-source>
<class>com.some.Entity</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
  <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
  <property name="hibernate.archive.autodetection" value="class" />
  <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup" />
  <property name="jta.UserTransaction" value="java:comp/UserTransaction" />
  <property name="hibernate.show_sql" value="true" />
  <property name="hibernate.format_sql" value="true" />
  <property name="hibernate.jdbc.fetch_size" value="100" />
  <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
</properties>
for container-managed transactions:

<property name="hibernate.transaction.factory_class">
    org.hibernate.transaction.CMTTransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
    org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>

for bean-managed transactions:

<property name="hibernate.transaction.factory_class">
    org.hibernate.transaction.JTATransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
    org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>
<property name="jta.UserTransaction">
    java:comp/UserTransaction
</property >