当前位置: 首页 > 知识库问答 >
问题:

从JPA2.0迁移到JPA2.1时出现“Unsupported use of GenericConnection”异常

微生毅然
2023-03-14

我们正在从WAS 8.5(使用OpenJPA2.0,Hibernate4.2.x[last JPA2.0version])迁移到WAS 9.0(使用eclipseLink[last JPA2.1version])),除了一件事之外,迁移是成功的。

为了在服务器上多次部署同一个应用程序并针对不同的数据库运行,我们在persistence.xml中定义了一个变量datasource引用:

  <persistence-unit name="App_DB" transaction-type="JTA">

    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>java:comp/env/jdbc/app/dataSourceRef</jta-data-source>

    <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect" />
      <property name="connection.autocommit" value="false" />           

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

      <property name="hibernate.hbm2ddl.auto" value="validate" />
      <property name="javax.persistence.validation.mode" value="none" />
    </properties>

  </persistence-unit>
<session name="StartUpService">
  <resource-ref name="jdbc/app/dataSourceRef" binding-name="jdbc/app/appDB"/>
</session>
@Singleton
@Startup
@LocalBean
public class StartUpService {

  @Resource(name = "jdbc/app/dataSourceRef", type = DataSource.class)
  DataSource dataSource;  

}

对于WAS8.5/openJPA来说,这一切都很好。但是在使用WAS9.0/eclipseLink时,这将不再起作用,并且在尝试启动应用程序时会出现以下异常:

[WebContainer:4]错误org.hibernate.hql.spi.id.IDTableHelper-无法使用JDBC连接创建语句java.sql.sqlException:不支持使用GenericConnection。在应用程序启动期间,当为持久性单元创建EntityManagerFactory时,提供GenericConnection;持久性单元已将其数据源之一配置为在组件命名上下文中;java:comp/env。在应用程序启动期间,组件命名上下文将不存在,并且无法确定正确的数据源。当使用持久化单元时,将获得并使用适当的数据源和连接。在com.ibm.ws.jpa.management.genericConnection.unsupportedUsesQlException(GenericConnection.java:636)~[com.ibm.ws.runtime.jar:?]在com.ibm.ws.jpa.management.genericConnection.createStatement(GenericConnection.java:144)~[com.ibm.ws.runtime.jar:?]在org.hibernate.hql.spi.id.idtableHelper.executeIDTableCreationStatements(idtableHelper.java:77)[org.hibernate-hibernate-core-5.2.18.final.jar:5.2.18.final.jar:5.2.18.final]在org.hibernate.hql.spi.id.global.globaltemporarytablebulkidStrategy.finishPreparation(temporaryTableBulkIdStrategy.java:42)[org.hibernate-hibernate-core-5.2.18.final.jar:5.2.18.final.jar:5.2.18.final]在org.hibernate.hql.spi.id.abstractMultiTableBulkIdStrategyImpl.prepare(abstractMultiTableBulkIdStrategyImpl.java:88)[org.hibernate-hibernate-core-5.2.18.final.jar:5.2.18.final]在在org.hibernate.boot.internal.sessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462)[org.hibernate-hibernate-core-5.2.18.final.jar:5.2.18.final]在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:945)[org.hibernate-hibernate-core-5.2.18.final.final]在org.hibernate.jpa.hibernatePersistenceProvider.createContainerEntityManagerFactoryBuilderImpl.jpapunit,在info.createemFactory(jpapunitInfo.java:1161)[com.ibm.ws.runtime.jar:?]

 [...]

在com.ibm.ws.util.threadpool$worker.run(threadpool.java:1909)[com.ibm.ws.runtime.jar:?]

[WebContainer:4]错误org.hibernate.engine.jdbc.spi.SqlExceptionHelper-不支持使用GenericConnection。在应用程序启动期间,当为持久性单元创建EntityManagerFactory时,提供GenericConnection;持久性单元已将其数据源之一配置为在组件命名上下文中;java:comp/env。在应用程序启动期间,组件命名上下文将不存在,并且无法确定正确的数据源。当使用持久化单元时,将获得并使用适当的数据源和连接。

000000A1 JPAPUnitInfo E CWWJP0015E:org.hibernate.jpa.HibernatePersistenceProvider持久化提供程序试图为App_DB持久化单元创建容器实体管理器工厂时出错。出现以下错误:[persistenceUnit:App_DB]无法构建Hibernate SessionFactory

因此,Hibernate似乎无法确定数据源。当我设置 的完整JDNI-name而不是引用时,如下所示

<jta-data-source>jdbc/app/appDB</jta-data-source> 

当我在网上搜索这个问题时,我发现建议您应该将javax.persistence.jtadatasource“添加到persistence.xml中,其值与 相同,如下所示:

<property name="javax.persistence.jtaDataSource" value="java:comp/env/jdbc/app/dataSourceRef" />

但这并没有改变我的情况。相同的错误和没有成功启动。

所以我对follong问题的答案很感兴趣:

共有1个答案

微生智刚
2023-03-14

一个帮助我的解决方案:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/myTest</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.target-database" value="Oracle"/>
<property name="eclipselink.target-server" value="WebSphere"/>
<property name="eclipselink.logging.level" value="FINEST"/>
<property name="javax.persistence.jtaDataSource" value="jdbc/myTest" />
</properties>
</persistence-unit>

因此,基本上错误是通过属性声明确认jtaDataSource的。

最后但并非最不重要的是,删除:

java:comp/env/jdbc/myTest

并将简单的JNDI引用:

jdbc/myTest
 类似资料:
  • 我正在将一个项目从GF 3.1.2(Eclipselink2.3.2)迁移到Payara 4.1.1.162(Eclipselink2.6.2)。 在部署war存档时,我遇到以下异常:

  • 在我的STS应用程序中实现Apache Ivy后收到以下控制台错误。 我添加了以下jar文件:

  • 从2.1.0迁移的Springboot版本2.2.1

  • 下面的方法已经使用了一段时间,当时我正在处理的系统有log4j。现在我们正在从Log4j转移到Log4j2,我会遇到编译问题。 Log4j2 jar:log4j-api-2.12.1.jar,log4j-core-2.12.1.jar 有没有人可以提供一些帮助,以解决上述问题的正确方法是什么?

  • 现在,当我尝试转到“domain.com/admin”时,我遇到了这个错误 此外,我应该能够使用phpmyadmin使用域,如,但不能使用新的IP。 我所做的: > 使用WinSCP将文件从旧VP复制到新VP。 domain.com代码 编辑/opt/lampp/etc/httpd。形态 编辑 /opt/lampp/etc/extra/httpd-vhosts.conf <代码> 编辑/opt/l

  • 我正在将一个应用程序从Spring 3迁移到Spring 4。特别是,我正在将其迁移到 这是与Spring 3一起使用的原始代码: 在Spring 4中,我将其更新为: 方法中的每一行都成功,并且返回行的结果不为空。但是,当方法退出时会发生异常: org.springframework.transaction.TransactionSystemException:无法提交Hibernate事务;嵌