使用JTA事务管理器(JBoss 7)的SPRING,JPA(EclipseLink) - 不承诺数据库

时间:2013-06-22 12:46:22

标签: spring jpa eclipselink jboss7.x jta

我用JTA事务管理器(JBoss 7)创建了一个示例 - SPRING,JPA(EclipseLink持久性提供程序)。我观察到数据库中的所有数据都在UI中正确显示以进行读取操作。但是,当涉及到保存/更新或删除操作时,服务层不会将工作提交到数据库。没有异常被捕获(我也检查了控制台/日志,并且还调试了我可以看到entityManager.persist / remove被调用的代码,没有任何异常)。

- 代码清单 - 1. standalone.xml中的数据源配置

<datasource jta="true" jndi-name="java:/mysql_customerdb3" pool-name="mysql_customerdb3_pool" enabled="true" use-java-context="true" use-ccm="true">
            <connection-url>jdbc:mysql://localhost:3306/customerdb</connection-url>
            <driver>mysql</driver>
            <security>
                <user-name>root</user-name>
                <password>root</password>
            </security>
            <statement>
                <prepared-statement-cache-size>10</prepared-statement-cache-size>
                <share-prepared-statements>true</share-prepared-statements>
            </statement>
        </datasource>
        <drivers>
            <driver name="mysql" module="com.mysql">
                <driver-class>com.mysql.jdbc.Driver</driver-class>
    <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
            </driver>
            <driver name="h2" module="com.h2database.h2">
                <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
            </driver>
        </drivers>
  1. module.xml中的数据库驱动程序配置

                              

  2. 的persistence.xml

        org.eclipse.persistence.jpa.PersistenceProvider     Java的:/ mysql_customerdb3     com.springforbeginners.model.Customer   

  3. customerdispatcher-servlet.xml中

    <context:annotation-config />
    <context:component-scan base-package="com.springforbeginners" />
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
        <property name="loadTimeWeaver" ref="loadTimeWeaver" />
        <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml" />
    </bean>
    
    <bean id="loadTimeWeaver" class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" >
    </bean>
    
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManagerName" value="java:jboss/TransactionManager"/>
        <property name="userTransactionName" value="java:jboss/UserTransaction"/>
    </bean> 
    
    <tx:annotation-driven transaction-manager="transactionManager" />
    

  4. CustomerServiceImpl.java

    package com.springforbeginners.service;

    import com.springforbeginners.dao.CustomerDAO; import com.springforbeginners.model.Customer; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;

    @服务 公共类CustomerServiceImpl实现CustomerService {     @Autowired     私人CustomerDAO customerDAO;

    @Transactional
    @Override
    public void addCustomer(Customer customer) {
        customerDAO.addCustomer(customer);
    }
    
    @Transactional
    @Override
    public List<Customer> listCustomer() {
        return customerDAO.listCustomer();
    }
    
    @Transactional
    @Override
    public void removeCustomer(Integer customerId) {
        customerDAO.removeCustomer(customerId);
    }
    

    }

  5. CustomerDAOImpl.java

    package com.springforbeginners.dao;

    import com.springforbeginners.model.Customer; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.stereotype.Repository;

    @Repository public class CustomerDAOImpl实现CustomerDAO {     @PersistenceContext(的unitName = “CustomerDetailsPU3”)     私有EntityManager entityManager;

    @Override
    public void addCustomer(Customer customer) {
        entityManager.persist(customer);
    }
    
    @Override
    public List<Customer> listCustomer() {
        return entityManager.createQuery("select c from Customer c", Customer.class).getResultList();
    }
    
    @Override
    public void removeCustomer(Integer customerId) {
        Customer customer = (Customer) entityManager.getReference(Customer.class, customerId);
        if (null != customer) {
            entityManager.remove(customer);
        }
    }
    

    }


  6. 我不知道究竟是什么以及在哪里缺少了什么。但是使用上面的代码,读取操作正如预期的那样工作。问题在于保存操作。我已经将上面的示例转换为使用非JTA数据源(也为jta = false修改了standalone.xml)并使用JpaTransactionManager如下所示

              

    使用非JTA数据源和'org.springframework.orm.jpa.JpaTransactionManager'所有操作(读取以及保存/更新/删除)都正常工作。

    但我的示例的JTA版本没有按预期工作(保存操作不会将工作提交到数据库)。任何帮助/指示赞赏。

    由于 普拉卡什


    詹姆斯

    我将在JBoss上运行此应用程序。但是JBoss上的一个数据源以及Glassfish和事务上的其他数据源应该同时跨越两个数据源的保存操作。这就是我想要实现的目标。我有一个Web应用程序,包括当前在JBoss上运行的spring for service(数据)层。

    如前所述 - 我将有两个persistence.xmls用于JBoss,一个用于Glassfish。当我第一次这样做的时候,我怀疑这个事务(跨越两个数据源在不同的服务器上 - 在这种情况下是JBoss和Glassfish),这可以完全由JBoss执行(如果整个业务逻辑驻留在在JBoss上部署的serviceImpl类)?在这种情况下,我将使用JBoss事务管理器(property name =“transactionManagerName”value =“java:jboss / TransactionManager”)。这是否足够或者我是否需要同样拥有Glassfish事务管理器?对不起,如果这造成了混乱。

    我的另一个问题是,是否有在persistence.xml /其他任何地方编写jndi端口的规定?(当然我将有两个不同的persistence.xmls,我将提到目标服务器作为JBoss在一个和作为Glassfish in另一个)。

    我们是否有一种技术在春天可以将业务逻辑分布在不同的服务器上,例如JBoss / Glassfish,并且仍在一个单一的转换中?我不知道这是否可以选择。您是否在谈论这种情况,其中每个服务器需要两个不同的部署脚本?

    由于 普拉卡什

2 个答案:

答案 0 :(得分:1)

你的persistence.xml是什么?

由于您使用的是JTA,因此必须定义“eclipselink.target-server”=“JBoss”

答案 1 :(得分:0)

我的persistence.xml(已修改)现在如下所示。在persistence.xml中添加了目标服务器属性。这解决了这个问题。

  <persistence-unit name="CustomerDetailsPU3" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:/mysql_customerdb3</jta-data-source>
    <class>com.springforbeginners.model.Customer</class>
    <properties>
          <property name="eclipselink.target-server" value="JBoss" />
    </properties>
  </persistence-unit>

由于 普拉卡什