DB2 driver class 无法在 persistence.xml 中解析并获取 entityManager 异常

DB2 driver class connot be resolved in persistence.xml and getting entityManager exception

我有一个项目,我必须在我的本地机器上运行。

它实际上有很多编译成jar文件的项目和一个编译成ear的主要项目,包括那些jar。

该应用程序在 WebSphere 服务器上 运行,尽管它 运行 我最终得到了一个关于实体管理器的错误。日志没有显示任何内容,但在调试后,当从特定 jar 的 class 调用方法时,我收到以下异常:

javax.el.ELException: javax.ejb.EJBException: The com.xxx.xxx.managers.xxxManager/entityManager reference of type javax.persistence.EntityManager for the XXXManager component in the xxx-managers.jar module of the XXXPortal_ear application cannot be resolved.

进一步检查后,我发现 IntelliJ 标记我的 persistence.xml 有一些错误:

<!-- Hibernate -->
<!-- <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/> -->
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.WebSphereJtaPlatform" />
<property name="hibernate.default_schema" value="XXX_TRANSACTIONS"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"/>
<property name="hibernate.connection.driver_class" value="com.ibm.db2.jcc.DB2XADataSource"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.default_batch_fetch_size" value="100"/>
<property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>      
<!-- OpenJPA -->
<property name="openjpa.jdbc.Schema" value="XXX_TRANSACTIONS"/>
<property name="openjpa.ConnectionDriverName" value="com.ibm.db2.jcc.DB2XADataSource"/>
<property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=True, PrettyPrint=true" />
<property name="openjpa.Log" value="DefaultLevel=DEBUG, Runtime=TRACE, Tool=INFO, Query=TRACE, JDBC=ERROR, SQL=ERROR" />

属性 hibernate.default_schema 的 XXX_TRANSACTIONS 值用红色标记并悬停显示:

Cannot resolve schema 'XXX_TRANSACTIONS'

此外,在 hibernate.connection.driver_class 属性 处,部分值 "com.ibm.db2.jcc.DB2XADataSource" 标记为红色(仅 db2.jcc.DB2XADataSource 为红色)。

悬停显示:

Cannot resolve class 'DB2XADataSource'

我尝试导入 db2jcc.jar 但后来我得到

com.ibm.db2.jcc.DB2XADataSource' is not assignable to 'java.sql.Driver'

在 driver class 属性.

我可能在 WebSphere 配置中搞砸了一些东西。

如果需要,我可以提供更多信息。

请帮忙。提前致谢。

编辑:

这些是来自 persistence.xml

的行
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="XxxModel">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>XxxDatasource</jta-data-source>
        <mapping-file>META-INF/orm.xml</mapping-file>
        <class>...

我也在post查看 WebSphere JDBC 提供程序的一般属性:

@Andy Guibert:遗憾的是我无法升级 Hibernate 版本,当我们重新部署给客户时可能会出现问题,因此我无法进行重大更改。

我不得不提到该应用程序可以在另一台机器上运行。它在 Rational Application Developer Studio(IBM 的 eclipse 版本)中打开。我正在尝试在 IntelliJ IDEA Ultimate Edition 上的本地计算机上进行设置。我发现的一个区别是在我的环境中创建的 jar 不包含 persistence.xml 和该特定模块的其他资源文件。我使用了 maven 资源插件来包含在我的 jar 中:

    <resources>
      <resource>
          <directory>src/main/java/META-INF</directory>
      </resource>
  </resources>

尽管如此,问题仍然存在,并且在调试时我仍然得到我在原始 post 中写的异常。

我相信 hibernate.connection.driver_class 属性 适用于 JDBC 驱动程序 class 对 java.sql.Driver class 的实现,但你有列出 com.ibm.db2.jcc.DB2XADataSource,这是 DB2 的 java.sql.XADataSource 实现,而不是 java.sql.Driver.

的实现

无论如何,我不建议您在 WebSphere 上以这种方式配置 Hibernate,因为当您将 Hibernate 配置为直接查看驱动程序时 class 它将绕过 WebSphere 的连接池并且您的性能会降低.

相反,我建议在 WebSphere 中配置数据源,然后在您的 persistence.xml 中引用数据源 JNDI 名称,如下所示:

<persistence ...>

  <persistence-unit name="SOME_PU" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/YOUR_DATASOURCE</jta-data-source>
  </persistence-unit>

</persistence>

请注意,从 Hibernate 5.2.17.Final 开始,Hibernate 有一个新的事务集成 class,它能够与 WebSphere(传统或 Liberty)事务管理器完全集成。如果您使用的是此版本或更高版本,则无需 hibernate.transaction.jta.platform