Tengo una Primavera Servicio Web (Spring-WS) de la aplicación que estoy tratando de configurar para usar. La pila que estoy usando es el siguiente

Spring 3
Spring-WS
JPA with Hibernate as the provider
JBoss 7.1*

La aplicación está configurada de la siguiente manera:

persistence.xml

<persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/myDataSource</jta-data-source>
        <non-jta-data-source>java:jboss/datasources/myDataSource</non-jta-data-source>
        <class>myPackage.MyClass</class>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>           
            <property name="hibernate.connection.autocommit" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
            <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/>
            <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider"/>
            <property name="hibernate.search.default.indexBase" value="./lucene/indexes"/>
            <property name="hibernate.search.default.batch.merge_factor" value="10"/>
            <property name="hibernate.search.default.batch.max_buffered_docs" value="10"/>
        </properties>
    </persistence-unit>

spring.xml – Entidad Pesebre y el administrador de Transacciones

<context:annotation-config/>

    <context:component-scan base-package="com.mypackage"/>

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

    <!-- Live database entity and transaction managers -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:dataSource-ref="myDataSource">

        <property name="persistenceUnitName" value="myPersistenceUnit" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory" />

    <tx:annotation-driven transaction-manager="transactionManager" />           

Web.xml – Para cargar la spring.xml archivo de arriba

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/app-config.xml
            /WEB-INF/spring.xml
            /WEB-INF/spring-datasources.xml
         </param-value>   
     </context-param>

spring-datasources.xml

<jee:jndi-lookup id="myDataSource" jndi-name="java:jboss/datasources/myDataSource"/>

En mi DAO clase i tiene la siguiente definición para el entityManager.

@PersistenceContext(type=PersistenceContextType.TRANSACTION, unitName="myPersistenceUnit")
protected EntityManager entityManager;

@Transactional
    public void updateProduct(Product product) {

        // Save the document to the database
        update(product);
    }

El método de actualización por encima de simplemente llama a un método genérico con una llamada a entityManager.merge(object);

Ahora cuando pruebo la de arriba me parece que funciona si estoy leyendo a partir de la base de datos, pero no funciona si estoy escribiendo a la base de datos (es decir, crear o actualizar).
Si trato de escribir a el me sale el siguiente excepción:

javax.persistence.TransactionRequiredException: Executing an update/delete query
   at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:96)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310)
   at $Proxy96.executeUpdate(Unknown Source)

Supongo que el hecho de que puedo leer de la base de datos significa que algo está mal en la configuración del administrador de transacciones. Alguna idea?

Editar

OK acabo de re-leer el anterior y se dio cuenta que el último bit es un poco mal. La excepción que he mostrado arriba sólo se produce si puedo usar JPQL para emitir una instrucción Update con entityManager.createQuery. Si intento actualizar a la entidad mediante entityManager.merge() nada de lo que en realidad sucede. Sin excepción No se devuelve, pero la fila no está actualizado.

  • Una pregunta tonta quizás, pero, ¿cómo se llama usted updadeProduct? Es por interfaz?
InformationsquelleAutor ziggy | 2012-06-13

2 Comentarios

  1. 4

    Cuando se marca un método como @Transaccional con el que usted cuenta JTA, sin embargo – como se indica por altanis – sin embargo, definir la unidad de persistencia del tipo de transacción como RESOURCE_LOCAL que no es JTA.

    1) Si desea utilizar las transacciones gestionadas por contenedor, a continuación, cambie el tipo de transacción, definir el origen de datos como origen de datos JTA en JBoss y en cambio no-jta-data-source para jta-data-source

    2) Si desea administrar sus propias transacciones, a continuación, mantener la persistence.xml y la definición de origen de datos como es, pero antes de cualquier persisten, combinar, eliminar las operaciones de iniciar una transacción llamando a entitymanager.getTransaction().begin() y al final de la unidad de negocio, llame a cualquiera de entitymanager.getTransaction().commit() o entitymanager.getTransaction().rollback(). En este caso, dado que la gestión de operaciones de ti mismo, entonces parece que no hay ningún punto en el inicio de una transacción JTA con @Transactional en updateProduct().

  2. 1

    pruebe a cambiar el tipo de transacción=»RESOURCE_LOCAL» para el tipo de transacción=»JTA» en persistence.xml. También usted puede ser que necesite para eliminar el elemento de persistence.xml.

    • No he configurado un origen de datos JTA en Jboss. El elemento que debe ser eliminado?
    • Yo estaba pensando acerca de la eliminación de la «no-jta-data-source». Me di cuenta de que el origen de datos es usada en el «no-jta-data-source», así como «jta-data-source». Esta es la razón por la que he mencionado sobre el cambio de «tipo de transacción» para JTA.
    • Gracias – lo he intentado pero no veo ninguna diferencia.

Dejar respuesta

Please enter your comment!
Please enter your name here