我用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>
module.xml中的数据库驱动程序配置
的persistence.xml
org.eclipse.persistence.jpa.PersistenceProvider Java的:/ mysql_customerdb3 com.springforbeginners.model.Customer
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" />
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);
}
}
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);
}
}
}
我不知道究竟是什么以及在哪里缺少了什么。但是使用上面的代码,读取操作正如预期的那样工作。问题在于保存操作。我已经将上面的示例转换为使用非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,并且仍在一个单一的转换中?我不知道这是否可以选择。您是否在谈论这种情况,其中每个服务器需要两个不同的部署脚本?
由于 普拉卡什
答案 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>
由于 普拉卡什