Bitronix + Spring + Hibernate + Persistencia

Estoy tratando de crear el administrador de transacciones y el uso con Hibernate para Oracle.

Mi persistence.xml archivo:

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

En applicationContext.xml de la primavera he añadido:

<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"/>

Sin embargo, cuando ejecuto:

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

Puedo obtener una excepción:

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

La excepción es en ds = (DataSource ) NamingHelper.getInitialContext(props).lookup(jndiName); de Hibernación infra archivo.

  1. Lo que podría ser el problema?

  2. ¿Cómo Hibernate persistencia sabe para referirse a la primavera txManager bean?

InformationsquelleAutor Dejell | 2011-02-17

6 Kommentare

  1. 2

    Su proveedor de persistencia hace sus búsquedas en jndi. Fuentes de datos definidas en la Primavera de contexto de la aplicación no están obligados a jndi. Por lo tanto, la persistencia del proveedor de búsqueda intento para el origen de datos falla ya que no existe tal origen de datos vinculado a jndi.

    Es posible que desee comprobar http://forum.springsource.org/showthread.php?t=13984.

    Puede intentar definir las fuentes de datos en el contexto del servidor y buscándolos en la primavera de aplicación por sus nombres jndi?

  2. 3

    Se ve como el origen de datos no ha sido creado aún cuando la Persistencia.createEntityManagerFactory() es llamado. Desde su bitronixTransactionManager bean depende del origen de datos, debería ver algo de INFORMACIÓN de registro de decirle BTM ha comenzado, que debe significar el origen de datos se ha creado también.

    Otra posible razón podría ser que Hibernan no buscar el origen de datos en el derecho contexto JNDI. Se puede activar la bitronix.tm.jndi registros de DEPURACIÓN de afirmar que su JNDI proveedor está recibiendo la llamada.

    • Veo que fue creado en los mensajes de registro: 2011-03-15 23:01:36,672 de DEPURACIÓN ( PoolingDataSource.java:84) – edificio XA piscina para jdbc/testDS1 con 0 de conexión(s), pero todavía tengo la excepción!
    • De nuevo: Otra posible razón podría ser que Hibernan no buscar el origen de datos en el derecho contexto JNDI. Se puede activar la bitronix.tm.jndi registros de DEPURACIÓN de afirmar que su JNDI proveedor está recibiendo la llamada.
  3. 3

    Lo que podría ser el problema?

    Que son capaces de consumir este origen de datos en un independiente de java de la aplicación, solicitando jdbc/testDS1? En regular Tomcat Orígenes de datos, sería necesario pedir java:comp/env/jdbc/testDS1, no sólo jdbc/testDS1.

    ¿Cómo Hibernate persistencia sabe para referirse a la primavera txManager bean?

    No. Usted está diciendo esto a Hibernar:

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

    Así, Hibernate utilice la búsqueda de la clase a, así, de «búsqueda» que el administrador de transacciones 🙂

    • Hola! Me acabo de dar cuenta que mi problema es que necesito java:comp/UserTransaction a encontrarse en el contexto. el problema no era con el ds1. Cuando he creado con tomcat – automáticamente acotado el <transacción> ficha para java:comp/UserTransaction. ¿cómo puedo hacerlo con la Primavera?
  4. 1

    Desea implementar esto como una GUERRA o el OÍDO? Hizo de declarar el origen de datos en el web.xml y configurar en el servidor de aplicaciones?

    ACTUALIZACIÓN: Desde que usted haya declarado el origen de datos en la GUERRA, asegúrese de que ha configurar el JNDI origen de datos en Tomcat.

    Su error, dice: «Causado por: org.hibernate.HibernateException: no se Pudo encontrar el origen de datos: jdbc/testDS1». Eso es un JNDI de búsqueda de nombre.

    Entonces, ¿a dónde «no quiero» encajan en esto?

    Primavera necesidades de Java Naming and Directory servicio para buscar el origen de datos asociado con este nombre; que es lo que Tomcat proporciona. Si no Tomcat, donde propone que la Primavera conseguir a partir de? El servicio de nombres es parte del servidor de aplicaciones Java EE.

    Usted tiene que configurar el JNDI origen de datos y la conexión de la piscina en Tomcat O renunciar a los beneficios que proporciona y decirle a la Primavera para utilizar un DriverManagerDataSource lugar:

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

    • ¿Por qué necesito para establecer el JNDI de datos con tomcat si estoy trabajando con la Primavera?
    • Bueno, en realidad esto funciona para mí. lo que no funciona es :DataSource ds = (DataSource) ic.de búsqueda(«java:comp/UserTransaction»); que utiliza para trabajar cuando he configurado con tomcat. También yo no uso la primavera directamente
    • así, en su respuesta, realmente están diciendo que tengo que configurar tomcat y la primavera juntos con el fin de obtener «java:comp/UserTransaction» jndi?
    • Tengo miedo de que la Primavera la documentación dice algo más <p><b>Para las transacciones JTA (NECESARIO, APOYA, OBLIGATORIO, NUNCA), una llanura JtaTransactionManager definición es todo lo que necesita, totalmente portátil a través de todos los servidores J2EE.Esto corresponde a la funcionalidad de la JTA UserTransaction para que J2EE especifica un estándar nombre JNDI («java:comp/UserTransaction»). No hay necesidad de configurar un servidor específico TransactionManager de búsqueda para este 79 * tipo de JTA de uso. Leer más: kickjava.com/src/org/springframework/transaction/jta/…
  5. 1

    Creo que tengo un escenario similar en ejecución. Mi persistence.xml es como el siguiente:

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

    Y la primavera de la aplicación de frijol archivo xml es como:

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

    Espero que ayude!

  6. 1

    Creo que tampoco es el persistence.xml no ha sido configered correctamente o no inicio de la Primavera contenedor.
    aquí os pongo mi persistence.xml código

    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>

    y mi código de prueba:

    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);

    el administrador de transacciones de configuración es la misma que la que has publicado.
    se puede trabajar.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea