无法在persistence.xml中解析DB2驱动程序类,并获取EntityManager异常

时间:2018-10-11 07:47:38

标签: hibernate db2 websphere

给我一​​个项目,我必须使其在本地计算机上运行。

实际上,有许多项目可以编译成jar文件,还有一个可以编译到耳朵的主项目,包括这些jar。

该应用程序在WebSphere服务器上运行,尽管运行了,但最终还是出现了有关实体管理器的错误。日志未显示任何内容,但在调试之后,从特定jar的类中调用方法时,出现以下异常:

  

javax.el.E​​LException:javax.ejb.EJBException:       com.xxx.xxx.managers.xxxManager / entityManager引用的类型       XXXManager组件中的javax.persistence.EntityManager       XXXPortal_ear应用程序的xxx-managers.jar模块无法解析。

进一步检查后,我发现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值标记为红色,并在屏幕上徘徊:

  

无法解析架构“ XXX_TRANSACTIONS”

此外,在hibernate.connection.driver_class属性中,值“ com.ibm.db2.jcc.DB2XADataSource”的一部分标记为红色(仅db2.jcc.DB2XADataSource为红色)。

悬停显示:

  

无法解析类'DB2XADataSource'

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

  

com.ibm.db2.jcc.DB2XADataSource'不可分配给'java.sql.Driver'

在驱动程序类属性上。

我可能会在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>...

我还将发布WebSphere JDBC提供程序的常规属性:

enter image description here

@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>

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

1 个答案:

答案 0 :(得分:1)

我相信hibernate.connection.driver_class属性是您的java.sql.Driver类的JDBC驱动程序实现类的,但是您列出了com.ibm.db2.jcc.DB2XADataSource,这是DB2对java.sql.XADataSource的实现,而不是其java.sql.Driver的实现。

无论如何,我不建议您在WebSphere上以这种方式配置Hibernate,因为当您配置Hibernate直接查看驱动程序类时,它将绕过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具有一个新的事务集成类,该类能够与WebSphere(传统或Liberty)事务管理器完全集成。如果您使用的是此版本或更高版本,则无需hibernate.transaction.jta.platform