NullPointerException в SettingsFactory.java:159-Hibernate 3,Oracle10g,Websphere6.1

Я использую Hibernate 3 на сервере приложений Websphere 6.1. Я использую JNDI для подключения к моему источнику данных. Я проверил подключение в консоли администратора, подключение прошло успешно. Но когда я развертываю свой проект на сервере и подключаюсь к источнику данных с помощью JNDI, я получаю сообщение об ошибке ниже.

Caused by: java.lang.NullPointerException
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:159)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)

Он показывает причину: ноль.

Я использую базу данных Oracle 10g.

Я вижу еще несколько исключений в журнале. Это связано с этой проблемой?

00000027 RegisteredRes E   WTRN0078E: An attempt by the transaction manager to call start on a transactional resource has resulted in an error. The error code was XAER_RMERR. The exception stack trace follows: oracle.jdbc.xa.OracleXAException
    at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1157)
    at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:295)
    at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.start(WSRdbXaResourceImpl.java:1324)
    at com.ibm.ejs.j2c.XATransactionWrapper.start(XATransactionWrapper.java:1467)
    at com.ibm.ws.Transaction.JTA.JTAResourceBase.start(JTAResourceBase.java:141)
    at com.ibm.ws.Transaction.JTA.RegisteredResources.startRes(RegisteredResources.java:1103)
    at com.ibm.ws.Transaction.JTA.RegisteredResources.enlistResource(RegisteredResources.java:525)
    at com.ibm.ws.Transaction.JTA.TransactionImpl.enlistResource(TransactionImpl.java:3219)
    at com.ibm.ws.Transaction.JTA.TranManagerSet.enlist(TranManagerSet.java:396)
    at com.ibm.ejs.j2c.XATransactionWrapper.enlist(XATransactionWrapper.java:693)
    at com.ibm.ejs.j2c.ConnectionManager.lazyEnlist(ConnectionManager.java:1723)
    at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.lazyEnlist(WSRdbManagedConnectionImpl.java:2109)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.beginTransactionIfNecessary(WSJdbcConnection.java:600)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.getMetaData(WSJdbcConnection.java:1533)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:116)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)

Другим исключением является

    00000027 XATransaction E   J2CA0030E: Method enlist caught javax.transaction.SystemException: XAResource start association error:XAER_RMERR
    at com.ibm.ws.Transaction.JTA.RegisteredResources.startRes(RegisteredResources.java:1154)
    at com.ibm.ws.Transaction.JTA.RegisteredResources.enlistResource(RegisteredResources.java:525)
    at com.ibm.ws.Transaction.JTA.TransactionImpl.enlistResource(TransactionImpl.java:3219)
    at com.ibm.ws.Transaction.JTA.TranManagerSet.enlist(TranManagerSet.java:396)
    at com.ibm.ejs.j2c.XATransactionWrapper.enlist(XATransactionWrapper.java:693)
    at com.ibm.ejs.j2c.ConnectionManager.lazyEnlist(ConnectionManager.java:1723)
    at com.ibm.ws.rsadapter.spi.WSRdbManagedConnectionImpl.lazyEnlist(WSRdbManagedConnectionImpl.java:2109)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.beginTransactionIfNecessary(WSJdbcConnection.java:600)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.getMetaData(WSJdbcConnection.java:1533)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:116)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383)
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954)
Caused by: oracle.jdbc.xa.OracleXAException
    at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1157)
    at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:295)
    at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.start(WSRdbXaResourceImpl.java:1324)
    at com.ibm.ejs.j2c.XATransactionWrapper.start(XATransactionWrapper.java:1467)
    at com.ibm.ws.Transaction.JTA.JTAResourceBase.start(JTAResourceBase.java:141)
    at com.ibm.ws.Transaction.JTA.RegisteredResources.startRes(RegisteredResources.java:1103)
while trying to enlist resources from datasource jdbc/OracleData with the Transaction Manager for the current transaction, and threw a ResourceException.

Ниже приведен мой файл конфигурации гибернации:

<hibernate-configuration>
    <session-factory>
        <property name="dialect">
            org.hibernate.dialect.Oracle10gDialect
        </property>
        <property name="hibernate.transaction.factory_class">
            org.hibernate.transaction.JTATransactionFactory
        </property>
        <property name="hibernate.transaction.manager_lookup_class">
            xxx.xxx.xxx.WebSphereExtendedJTATransactionLookup
        </property>
        <property name="jta.UserTransaction">
            java:comp/UserTransaction
        </property>
    </session-factory>
</hibernate-configuration>

Здесь WebSphereExtendedJTATransactionLookup реализует org.hibernate.transaction.TransactionManagerLookup.

Вот как я создаю сеанс

final Configuration configuration = new AnnotationConfiguration();
configuration.setProperty("hibernate.connection.datasource", dataSource);
configuration.setProperty(org.hibernate.cfg.Environment.SHOW_SQL, System.getProperty(SHOW_SQL,"false"));
configuration.configure();
return configuration.buildSessionFactory();

person Prabu Dhanapal    schedule 05.06.2013    source источник


Ответы (1)


к сожалению, я не могу много сказать, не глядя на ваши файлы конфигурации, но я попробую. Эта ошибка, по-видимому, связана с конфигурацией соединения между вашим приложением и пулом JNDI.

  • Убедитесь, что ваш дескриптор развертывания (web.xml) содержит конфигурацию соединения JNDI, например:
    
        <resource-ref>
            <description>Your New DataSource</description>
            <res-ref-name>jdbc/mysqlblogpostdataref</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
        </resource-ref>
    
  • И посмотрите на свой hibernate.cfg (при условии, что вы не используете Spring) для проблем с конфигурацией, вот еще один пример:


<property name="current_session_context_class">thread</property>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="hibernate.connection.datasource">java:comp/env/jdbc/mysqlblogpostdataref</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
Также обязательно проверьте конфигурацию в файле context.xml, как указано здесь Настроить спящий режим для подключения к базе данных через источник данных JNDI.

Источник для других примеров: http://jefferyhaynes.net/2009/11/29/websphere-hibernate-datasource-configuration-for-mysql/

ИЗМЕНИТЬ На основе вашего обновления я смог провести небольшое исследование, посмотрите, что я нашел:

(от: IBM)

Ошибка заключается в том, что диспетчер транзакций не смог преобразовать транзакцию в транзакцию XA. В частности, Oracle вернул ошибку XAER_RMERR, номер кода ошибки 65535. ORA-65535 не является допустимым кодом ошибки, а XAER_RMERR, по сути, означает, что что-то пошло не так с XA. Это указывает на то, что ваша база данных Oracle не настроена для поддержки транзакций XA. Поэтому, когда диспетчер транзакций WebSphere Application Server дает указание диспетчеру транзакций Oracle участвовать в этой транзакции XA, Oracle не может выполнить это требование и выдает это исключение.

Кроме того, обязательно взгляните на свои файлы context.xml и web.xml, при работе с WS я забывал их настраивать.

person Ederson    schedule 05.06.2013
comment
Привет, я правильно указал имя источника данных jndi. Тот же проект работает, когда я задаю всю конфигурацию в самом файле hibernate.cfg (например, URL-адрес сервера базы данных, имя пользователя, пароль). Но это терпит неудачу, когда я делаю то же самое с jndi. Я хочу использовать глобальную транзакцию websphere (XA) между MQ и моей базой данных оракула. Я вижу еще несколько исключений в журнале. Я обновил их в вопросе. Пожалуйста, посмотрите. - person Prabu Dhanapal; 06.06.2013