1

我正在尝试使用 JPA、Spring、hibernate 和 tomcat 配置 JOTM。我以某种方式进行了配置,但它既不执行插入也不执行更新,换句话说,我无法在插入/更新数据后执行提交。我有以下配置。

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

在 %TOMCAT%/lib 中提取的 JOTM 2.1.9 库

          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/main/webapp/META-INF/context.xml

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

src/main/webapp/WEB-INF/classes/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>

应用程序上下文.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/main/java/com.test.dao.PUserRepository(Spring 数据存储库)

public interface PUserRepository extends JpaRepository<PUser, Serializable>
{

    PUser findByName(String username);
}

提前致谢。

4

1 回答 1

3

由于您使用的是 JTA,因此您的事务类型应该transaction-type="JTA"在您的 persistence.xml 中。您可以在配置和引导下阅读更多信息。

于 2012-09-11T05:50:58.757 回答