Hibernate &引用;不支持使用GenericConnection“;从JPA2.0迁移到JPA2.1时出现异常

Hibernate &引用;不支持使用GenericConnection“;从JPA2.0迁移到JPA2.1时出现异常,hibernate,jpa,websphere,eclipselink,openjpa,Hibernate,Jpa,Websphere,Eclipselink,Openjpa,我们正在从WAS 8.5(JPA2.0使用openJPA,Hibernate 4.2.x[上一个JPA2.0版本])迁移到WAS 9.0(JPA2.1使用eclipseLink和Hibernate 5.2.18[上一个JPA2.1版本]),除了一件事外,迁移是成功的 为了能够在服务器上多次部署同一应用程序并在不同的数据库上运行,我们在persistence.xml中定义了变量DataSource引用: <persistence-unit name="App_DB" transactio

我们正在从WAS 8.5(JPA2.0使用openJPA,Hibernate 4.2.x[上一个JPA2.0版本])迁移到WAS 9.0(JPA2.1使用eclipseLink和Hibernate 5.2.18[上一个JPA2.1版本]),除了一件事外,迁移是成功的

为了能够在服务器上多次部署同一应用程序并在不同的数据库上运行,我们在
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>
并在课堂上使用,如下所示:

@Singleton
@Startup
@LocalBean
public class StartUpService {

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

}
对于WAS 8.5/openJPA,这一切都很好。但当使用WAS 9.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.UnsupportedUserSqlException(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] 在org.hibernate.hql.spi.id.GlobalTemporaryTableBulkIdStrategy.finishPreparion(GlobalTemporaryTableBulkIdStrategy.java:125)[org.hibernate-hibernate-core-5.2.18.Final.jar:5.2.18.Final] 位于org.hibernate.hql.spi.id.GlobalTemporaryTableBulkIdStrategy.finishPreparion(GlobalTemporaryTableBulkIdStrategy.java:42)[org.hibernate-hibernate-core-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.internal.sessionfactorympl.(sessionfactorympl.java:305)[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.jar:5.2.18.Final] 在org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManager工厂(HibernatePersistenceProvider.java:151)[org.hibernate-hibernate-core-5.2.18.Final.jar:5.2.18.Final] 在com.ibm.ws.jpa.management.JPAPUnitInfo.createmFactory(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。在应用程序启动期间,组件命名上下文将不存在,并且无法确定正确的数据源。当使用持久化单元时,将获得并使用适当的数据源和连接

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

因此,Hibernate似乎无法确定
数据源。当我设置
的完整JDNI名称而不是像这样设置引用时

<jta-data-source>jdbc/app/appDB</jta-data-source> 
但这并没有改变我的情况。相同的错误,没有成功启动

因此,我对以下问题的答案很感兴趣:

  • 主要问题:如何定义我的
    persistence.xml
    以再次使用
    DataSource
    引用?如果针对应用程序的所有实例针对同一数据库进行启动validaten,则没有任何帮助,即使正在运行的应用程序在启动后将使用另一个数据源,因为我显然想验证实例实际使用的
    数据源注意:更改JPA实现不会由我们的管理员完成-他们只会坚持IBM支持的原始配置

  • 小问题:为什么Hibernate(4.2.x)结合openJPA可以使用WAS8.5中的参考,而Hibernate(5.2.18)结合eclipseLink不能在WAS9.0中使用


  • 去更新一下。我的帖子不是一个有效解决方案的答案,而是对发生的事情(据我所知)和失败原因的进一步解释。在它成为我为工作而写的分析(超过4页)的一个简短版本之前,我要说的是,因为我不想完全从德语翻译过来(我的英语很差),而且它们是基于几个我不能在这里发布的日志文件

    td;dr

    IBM必须改变WAS9

    说来话长

    在与我们的管理员再次交谈后,我做了进一步的研究:

    IBM抛出了不支持使用GenericConnection的错误
    ,甚至在
    
    <property name="javax.persistence.jtaDataSource" value="java:comp/env/jdbc/app/dataSourceRef" />
    
    <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>
    
    java:comp/env/jdbc/myTest
    
    jdbc/myTest