2012-09-10 45 views
1

我想用JPA,Spring,hibernate和tomcat配置JOTM。我配置了某種方式,但它既不執行插入也不更新,換句話說,我無法在插入/更新數據後執行提交。我有以下配置。容器託管JPA + Spring + Tomcat的事務處理

%TOMCAT_HOME%/ CONF/context.xml中

<?xml version="1.0" encoding="utf-8"?> 
<Context> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <Resource name="jdbc/myDS" auth="Container" type="javax.sql.XADataSource" factory="org.objectweb.jotm.datasource.DataSourceFactory" driverClassName="com.mysql.jdbc.Driver" username="root" password="mypassword" url="jdbc:mysql://localhost:3306/myDB"/> 
    <Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction"/> 
    <Transaction factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60"/> 
</Context> 

JOTM 2.1.9 libaries在%TOMCAT提取%/ lib中

  Jotm-datasource.jar 
·   Jotm-core.jar 
·   Xapool.jar 
·   Log4j.jar 
·   Commons-loggin-api.jar 
·   Carol-iiop-delegate.jar 
·   Carol-interceptors.jar 
·   Carol.jar 
·   Ow2-jta-1.1-spec.jar 
·   Ow2-connector-1.5-spec.jar 
·   Howl.jar 

的src /主/ web應用/ META-INF/context.xml

<Context path="/MyJPATest" reloadable="true"> 
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/> 
</Context> 

的src /主/ web應用/ WEB-INF /類/ carol.properties

# JNDI (Protocol Invocation) 

carol.protocols=jrmp 

# Local RMI Invocation 
carol.jvm.rmi.local.call=true 


# do not use CAROL JNDI wrapper 
carol.start.jndi=false 

# do not start a name server 
carol.start.ns=false 

# Naming Factory 
carol.jndi.java.naming.factory.url.pkgs=org.apache.naming 

META-INF/persistence.xml中

<?xml version="1.0" encoding="utf-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> 
    <persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:comp/env/jdbc/myDS</jta-data-source> 
     <class>com.test.domain.PUser</class> 
     <exclude-unlisted-classes>true</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

的applicationContext.xml

<bean 
     id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" > 
     <property 
      name="persistenceUnitName" 
      value="myPersistenceUnit" /> 
    </bean> 


    <context:annotation-config /> 

    <jee:jndi-lookup 
     id="jndiUserTransaction" 
     jndi-name="java:comp/UserTransaction" /> 

    <bean 
     id="transactionManager" 
     class="org.springframework.transaction.jta.JtaTransactionManager" > 

     <property 
      name="userTransaction" 
      ref="jndiUserTransaction" /> 
    </bean> 


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

     <jpa:repositories 
     base-package="com.test" 
     entity-manager-factory-ref="entityManagerFactory" /> 



    <bean 
     id="hibernate4ExceptionTranslator" 
     class="org.springframework.orm.hibernate4.HibernateExceptionTranslator" /> 

的web.xml

<resource-ref> 
     <res-ref-name>jdbc/myDS</res-ref-name> 
     <res-type>javax.sql.XADataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 

PUserService的方法

@Transactional 
    public List<PUser> bootstrapUsers() 
    { 

     List<PUser> users = new ArrayList<PUser>(); 

     try 
     { 


      for (int i = 0; i < 5; i++) 
      { 

       PUser newUser = new PUser(); 
       newUser.setName("B_" + i); 
       PUser user = this.pUserRepository.save(newUser); 


       users.add(user); 

      } 

     } 
     catch (Exception e) 
     { 
      this.logger.error(e, e); 

      return null; 
     } 

     return users; 

    } 

的src /主/爪哇/ com.test.dao.PUserRepository(彈簧數據儲存庫)

public interface PUserRepository extends JpaRepository<PUser, Serializable> 
{ 

    PUser findByName(String username); 
} 

提前致謝。

+0

你可以在最後調用PUserRepository#flush()並打印出堆棧跟蹤,如果在此時沒有事務處於活動狀態,它應該拋出異常。它會給出關於這個問題的想法。 – firefox784

回答

3

由於您正在使用JTA,因此您的交易類型應該是transaction-type="JTA"在persistence.xml中。您可以在Configuration和bootstrapping下閱讀here

+0

你是絕對正確的。我應該但在這裏我沒有使用JEE容器,但支持JOTM的servlet容器,因此切換到JTA不被tomcat接受。我用JEE容器成功配置了容器管理事務,其中我使用了JTA事務類型,但無法使用tomcat進行配置。 – Rehman