Битроникс + Весна + Спящий + Постоянство - PullRequest
2 голосов
/ 17 февраля 2011

Я пытаюсь создать менеджер транзакций и использовать его с Hibernate для Oracle.

Мой файл persistence.xml:

<persistence-unit name="org.drools.persistence.jpa"
        transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/testDS1</jta-data-source>
        <class>org.drools.persistence.session.SessionInfo</class>
        <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
        <class>org.drools.persistence.processinstance.WorkItemInfo</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
            <property name="hibernate.connection.autocommit" value="false" />
            <property name="hibernate.max_fetch_depth" value="3" />
            <property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/> 
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.transaction.manager_lookup_class"
                value="org.hibernate.transaction.BTMTransactionManagerLookup" />
        </properties>
    </persistence-unit>

В applicationContext.xml весны я добавил:

<bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init" destroy-method="close"> 
           <property name="className" value="oracle.jdbc.xa.client.OracleXADataSource" /> 
           <property name="uniqueName" value="jdbc/testDS1" /> 
           <property name="minPoolSize" value="1" /> 
           <property name="maxPoolSize" value="5" /> 
           <property name="driverProperties">
            <props>
                <prop key="URL">myURL</prop>
                <prop key="user">username</prop>
                <prop key="password">password</prop>
            </props>
        </property>       
    </bean> 

    <bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
        <property name="transactionManager" ref="bitronixTransactionManager"/> 
        <property name="userTransaction" ref="bitronixTransactionManager"/> 
    </bean> 

    <bean id="bitronixTransactionManager" factory-method="getTransactionManager" 
          class="bitronix.tm.TransactionManagerServices" depends-on="dataSource,txManager" 
          destroy-method="shutdown"/>

Однако, когда я бегу:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");

Я получаю исключение:

Caused by: org.hibernate.HibernateException: Could not find datasource: jdbc/testDS1

Исключение составляет ds = (DataSource ) NamingHelper.getInitialContext(props).lookup(jndiName); файла Hibernate.

  1. В чем может быть проблема?

  2. Как Hibernate знает, что относится к бобу весны txManager?

Ответы [ 6 ]

3 голосов
/ 16 марта 2011

В чем может быть проблема?

Можете ли вы использовать этот источник данных в автономном Java-приложении, запрашивая jdbc/testDS1?В обычных источниках данных Tomcat вам нужно будет запросить java:comp/env/jdbc/testDS1, а не только jdbc/testDS1.

Как Hibernate знает, что такое ссылка на bean-компонент spring txManager?Вы говорите это Hibernate:

        <property name="hibernate.transaction.manager_lookup_class"
            value="org.hibernate.transaction.BTMTransactionManagerLookup" />

Итак, Hibernate будет использовать класс поиска для «поиска» менеджера транзакций :-)

3 голосов
/ 21 февраля 2011

Похоже, ваш источник данных еще не был создан при вызове Persistence.createEntityManagerFactory ().Поскольку ваш bean-компонент bitronixTransactionManager зависит от источника данных, вы должны увидеть журнал INFO, сообщающий, что BTM запущен, что должно означать, что источник данных тоже создан.

Другая потенциальная причина может заключаться в том, что Hibernate не ищет источник данных.в правильном контексте JNDI.Вы можете разрешить bitronix.tm.jndi журналам DEBUG утверждать, что вызывается его провайдер JNDI.

2 голосов
/ 22 марта 2011

Ваш поставщик сохраняемости выполняет поиск на jndi.Источники данных, определенные в контексте приложения Spring, не связаны с jndi.Следовательно, попытка поиска источника данных для источника данных не удалась, поскольку такой источник данных не связан с jndi.

Возможно, вы захотите проверить http://forum.springsource.org/showthread.php?t=13984.

Можете ли вы попытаться определить свойисточники данных в контексте сервера и их поиск в весеннем приложении по их именам jndi?

1 голос
/ 16 июля 2011

Я думаю, что файл persistence.xml не был правильно сконфигурирован или вы не запустили контейнер SPring здесь я публикую свой код persistence.xml

enter code here
<persistence-unit name="org.drools.task" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jdbc/mysql</jta-data-source>
    <class>org.drools.task.Attachment</class>
<properties>
        <property name="hibernate.archive.autodetection" value="class"/>
        <property name="hibernate.current_session_context_class" value="jta" />
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
        <property name="hibernate.jndi.class" value="bitronix.tm.jndi.BitronixInitialContextFactory"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
        <property name="hibernate.show_sql" value="true" />

        <!-- after first run the application, should comment it, else it will drop and create table each time 
        <property name="hibernate.hbm2ddl.auto" value="create" /> -->
</properties>
</persistence-unit>

и мой код тестирования:

enter code here
    ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
    JtaTransactionManager txManager = (JtaTransactionManager) ctx.getBean("txManager");
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = txManager.getTransaction(def);
    System.out.println("The transaction manager is "+txManager);
    System.out.println("The transaction is "+status);

Конфигурация менеджера транзакций такая же, как вы отправили. это может работать.

1 голос
/ 16 марта 2011

Полагаю, у меня запущен похожий сценарий. Мой файл persistence.xml выглядит следующим образом:

<persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <!-- other configuration ommited -->
    <jta-data-source>java:comp/env/jdbc/YourPersistentUnitJNDI_Name</jta-data-source>
    <!-- other configuration ommited -->
</persistence-unit>

И XML-файл bean-приложения Spring выглядит так:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="myPersistenceUnit" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
        </property>
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>

Надеюсь, это поможет!

1 голос
/ 17 февраля 2011

Вы развертываете это как WAR или EAR?Вы объявили источник данных в своем файле web.xml и настроили его на сервере приложений?

ОБНОВЛЕНИЕ: Поскольку вы объявили источник данных в вашей WAR, убедитесь, что вы настроили источник данных JNDI в Tomcat.

Ваша ошибка говорит:Msgstr "Причина: org.hibernate.HibernateException: не удалось найти источник данных: jdbc / testDS1".Это имя поиска JNDI.

Так, где "я не хочу" вписывается в это?

Spring требуется служба именования и каталогов Java для поиска источника данных, связанного с этим именем;это то, что обеспечивает Tomcat.Если не Tomcat, где вы предлагаете Spring получить его?Служба именования является частью сервера приложений Java EE.

Вы должны либо настроить источник данных JNDI и пул соединений в Tomcat, либо отказаться от преимуществ, которые он предоставляет, и сказать Spring вместо этого использовать DriverManagerDataSource:

http://static.springsource.org/spring/docs/2.5.x/reference/jdbc.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...