2016-09-24 6 views
0

Я изучаю использование менеджера транзакций JTA с Spring Data JPA. Я успешно настроил Atomikos и Bitronix и пытаюсь настроить JBossTS (Arjuna/Narayana).Как использовать JBossTS (Narayana) с Spring Data JPA

Я следовал инструкциям для configuring JBossTS for Spring и подошел со следующей конфигурацией:

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="jpaProperties"> 
    <props> 
     <prop key="hibernate.format_sql">true"</prop> 
     <prop key="hibernate.hbm2ddl.auto">create-drop</prop> 
     <prop key="hibernate.id.new_generator_mappings">false</prop> 
     <prop key="hibernate.transaction.jta.platform">org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform</prop> 
     <prop key="hibernate.use_sql_comments">true</prop> 
    </props> 
    </property> 
    <property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="databasePlatform" value="org.hibernate.dialect.H2Dialect"/> 
     <property name="generateDdl" value="true"/> 
     <property name="showSql" value="true"/> 
    </bean> 
    </property> 
    <property name="jtaDataSource"> 
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="connectionProperties"> 
     <props> 
      <prop key="dynamicClass">com.arjuna.ats.internal.jdbc.drivers.PropertyFileDynamicClass</prop> 
      <prop key="password"></prop> 
      <prop key="user">sa</prop> 
     </props> 
     </property> 
     <property name="driverClassName" value="com.arjuna.ats.jdbc.TransactionalDriver"/> 
     <property name="url" value="jdbc:arjuna:database.properties"/> 
    </bean> 
    </property> 
    <property name="packagesToScan" value="org.example.domain"/> 
</bean> 

<bean class="org.springframework.transaction.jta.JtaTransactionManager" id="transactionManager"> 
    <property name="transactionManager"> 
    <bean class="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple"/> 
    </property> 
    <property name="userTransaction"> 
    <bean class="com.arjuna.ats.jta.UserTransaction" factory-method="userTransaction"/> 
    </property> 
</bean> 

<transaction:annotation-driven/> 

Однако попытки запустить приложение выдает следующее сообщение об ошибке:

java.lang.IllegalStateException: Failed to load ApplicationContext 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
Caused by: org.hibernate.exception.GenericJDBCException: Unable to open JDBC Connection for DDL execution 
Caused by: java.sql.SQLException: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 
    at com.arjuna.ats.internal.jdbc.IndirectRecoverableConnection.createDataSource(IndirectRecoverableConnection.java:361) 
    at com.arjuna.ats.internal.jdbc.IndirectRecoverableConnection.<init>(IndirectRecoverableConnection.java:109) 
    at com.arjuna.ats.internal.jdbc.ConnectionImple.<init>(ConnectionImple.java:107) 
    at com.arjuna.ats.internal.jdbc.ConnectionManager.create(ConnectionManager.java:110) 
    at com.arjuna.ats.jdbc.TransactionalDriver.connect(TransactionalDriver.java:87) 
    at java.sql.DriverManager.getConnection(DriverManager.java:664) 
    at java.sql.DriverManager.getConnection(DriverManager.java:208) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153) 
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:144) 
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:196) 
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:159) 
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) 
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:180) 
    at org.hibernate.resource.transaction.backend.jta.internal.DdlTransactionIsolatorJtaImpl.prepare(DdlTransactionIsolatorJtaImpl.java:49) 
    ... 60 more 
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial 
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662) 
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313) 
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350) 
    at javax.naming.InitialContext.lookup(InitialContext.java:417) 
    at com.arjuna.ats.internal.jdbc.IndirectRecoverableConnection.createDataSource(IndirectRecoverableConnection.java:346) 

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

Образец приложения is available on Github в случае, если требуется полная конфигурация и исходный код. Проблему можно увидеть, выполнив тесты Maven как mvn test -D"spring.profiles.active=jbossts".

ответ

1
  1. Заменить <prop key="dynamicClass"> с <prop key="DYNAMIC_CLASS">
  2. Укажите свойства файла с target/classes
  3. Используйте файл базы данных H2 вместо памяти

Для получения дополнительной информации вы можете увидеть narayana.io

+0

Спасибо @ AmosFeng, ваш совет по использованию 'DYNAMIC_CLASS' вместо' dynamicClass' работал. – manish

 Смежные вопросы

  • Нет связанных вопросов^_^