- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家好,我已经使用 jsf、spring 3.0、hybernate + JPA 和 atomikos 完成了一个应用程序配置,用于 XA 事务管理,mysql 是我的后端,这里一切正常,但是插入操作,当异常抛出时事务应该回滚,但它没有发生!这是我们应用程序的一个小流程 我正在使用 jsfmanagedbean 来调用我的服务,从我的服务类开始我的事务
TextileUIBean.java
包com.textile.web; 公共(public)类 TextileUIBean 扩展 BaseManagedBean 实现可序列化, { 公共(public) insertPaymentDetails() { PaymentDetails PaymentDetails=new PaymentDetails(); //值是硬编码的,只有两个属性只使用 PaymentDetails.setCustomerName("Manikandan"); PaymentDetails.setAmount(1000); getTextileManager().insertPaymentDetails(PaymentDetails); } 公共(public) ITextileManager getTextileManager() { textileManager = (ITextileManager) getBean("textileManager"); 返回 textileManager; }
service class
package com.textile.web
public interface ITextileManager
{
public void insertPaymentDetails(PaymentDetails PaymentDetails);
}
package com.textile.web
public class TextileManager implements ITextileManager
{
ITextileBusiness TextileBusiness ;
public void setTextileBusiness(ITextileBusiness textileBusiness) {
this.textileBusiness = textileBusiness;
}
void insertPaymentDetails(PaymentDetails PaymentDetails)
{
TextileBusiness.insertPaymentDetails(PaymentDetails);
}
and my business class is
package com.textile.web
public interface ITextileBusiness
{
public void insertPaymentDetails(PaymentDetails PaymentDetails);
}
package com.textile.web
public class TextileBusiness implements ITextileBusiness
{
ITextileDao textileDao;
public void setTextileDao(ITextileDao textileDao) {
this.textileDao = textileDao;
}
void insertPaymentDetails(PaymentDetails ormPaymentTable)
{
OrmPaymentTable ormPaymentTable= OrmPaymentTable();
ormPaymentTable.setCustomerName(PaymentDetails.getCustomerName());
ormPaymentTable.setAmount(PaymentDetails.getAmount(););
textileDao.insertPaymentDetails(ormPaymentTable);
int a=0;
if(a==0)
throw new BusinessException("Transcation Rollback");
}
}
and my dao class is
package com.textile.web
public interface IPaymentsDao {
public void insertPaymentDetails(OrmPaymentTable ormPaymentTable);
}
package com.textile.web
public class PaymentsDao implements IPaymentsDao
{
void insertPaymentDetails(OrmPaymentTable ormPaymentTable)
{
this.getJpaTemplate().persist(ormPaymentTable);
after this line the record is insertinf into table
}
}
my FacesConfig.xml is
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
<locale-config>
<default-locale>en</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
<message-bundle>Messages</message-bundle>
</application>
<managed-bean> <managed-bean-name>textileUIBean</managed-bean-name> <managed-bean-class>com.textile.web.TextileUIBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
</managed-bean>
我的applicationConfig.xml文件是
<beans:bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean" >
<beans: property name="jndiName">
<beans: value>java:comp/env/jdbc/textWeb</beans:value>
</beans: property>
<beans: property name="resourceRef">
<beans:value>true</beans:value>
</beans: property>
</beans: bean>
<beans: bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
<beans: property name="entityManagerFactory">
<beans: ref bean="entityManagerFactory" />
</beans: property>
</beans: bean>
<beans: bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!-- hidden by shiju because we need one datasource support its in prsistence.xml !-->
<beans: property name="dataSource">
<beans: ref bean="dataSource" />
</beans: property>
<beans: property name="persistenceUnitName" value="payhub" />
<beans: property name="jpaVendorAdapter">
<beans:bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<beans: property name="generateDdl" value="false" />
<beans: property name="showSql" value="true" />
<beans: property name="databasePlatform" value="${database.target}" />
</beans: bean>
</beans: property>
<beans: property name="persistenceXmlLocation">
<beans: value>classpath:META-INF/persistence.xml</beans:value>
</beans: property>
</beans: bean>
<beans:bean id="textileManager"
class=" com.textile.web.TextileManager">
<beans: property name="textileBusiness" ref="textileBusiness" />
</beans: bean>
<beans: bean id="textileBusiness" class="com.textile.web.TextileBusiness">
<beans: property name="textileDao" ref="textileDao" />
</beans: bean>
<beans: bean id="textileDao" class="com.textile.web.textileDao">
<beans: property name="jpaTemplate">
<beans: ref bean="jpaTemplate"/>
</beans: property>
</beans: bean>
<aop:config>
<aop:pointcut id="fooServiceOperation" expression="execution(* com.textile.web.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<beans: bean id="atomikosTransactionManager"
class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init"
destroy-method="close">
<beans: property name="forceShutdown" value="true" />
<beans: property name="startupTransactionService" value="true" />
</beans:bean>
<beans:bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
<beans: property name="transactionTimeout">
<beans: value>3000</beans:value>
</beans: property>
</beans:bean>
<beans: bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<beans: property name="transactionManager">
<beans: ref bean="atomikosTransactionManager" />
</beans: property>
<beans: property name="userTransaction">
<beans: ref bean="atomikosUserTransaction"/>
</beans: property>
<beans: property name="rollbackOnCommitFailure" value="true">
</beans: property>
</beans: bean>
and orm.xml file is
<entity class="OrmPaymentTable" name="OrmPaymentTable">
<table name="ta_payment" />
<attributes>
<id name="paymentId">
<column name="USER_ID" />
<generated-value strategy="AUTO" />
</id>
<basic name="customerName">
<column name="CUST_NAME" length="50" />
</basic>
<basic name="amount">
<column name="AMOUNT" length="50" />
</basic>
</attributes>
</entity>
<persistence-unit name="payhub" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:comp/env/jdbc/textWeb</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<class>com.textile.web.OrmPaymentTable</class>
<properties>
<property name="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
<property name="hibernate.transaction.factory_class"
value="org.hibernate.transaction.JTATransactionFactory" />
</properties>
</persistence-unit>
</persistence>
我在 meta-inf/context.xml 中配置 jndi
<Context>
<Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory"/>
<Resource name="jdbc/textWeb" auth="Container"
driverClassName="com.mysql.jdbc.Driver" user="root" password="root"
type="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" factory="com.mysql.jdbc.jdbc2.optional.MysqlDataSourceFactory"
url="jdbc:mysql://localhost:3306/textWeb" explicitUrl="true"
pinGlobalTxToPhysicalConnection="true">
</Resource>
</Context>
web.xml
<resource-ref>
<description>PaymentsDatabase</description>
<res-ref-name>jdbc/textWeb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
我跟踪日志..查看我的交易日志详细信息
78 [main] INFO atomikos - USING core version: 3.6.4
78 [main] INFO atomikos - USING com.atomikos.icatch.console_file_name = tm.out
78 [main] INFO atomikos - USING com.atomikos.icatch.console_file_count = 1
78 [main] INFO atomikos - USING com.atomikos.icatch.automatic_resource_registration = true
78 [main] INFO atomikos - USING com.atomikos.icatch.client_demarcation = false
78 [main] INFO atomikos - USING com.atomikos.icatch.threaded_2pc = true
78 [main] INFO atomikos - USING com.atomikos.icatch.serial_jta_transactions = false
78 [main] INFO atomikos - USING com.atomikos.icatch.log_base_dir = .\
94 [main] INFO atomikos - USING com.atomikos.icatch.console_log_level = WARN
94 [main] INFO atomikos - USING com.atomikos.icatch.max_actives = 50
94 [main] INFO atomikos - USING com.atomikos.icatch.checkpoint_interval = 500
94 [main] INFO atomikos - USING com.atomikos.icatch.enable_logging = false
94 [main] INFO atomikos - USING com.atomikos.icatch.output_dir = .\
94 [main] INFO atomikos - USING com.atomikos.icatch.log_base_name = tmlog
94 [main] INFO atomikos - USING com.atomikos.icatch.console_file_limit = 0
94 [main] INFO atomikos - USING com.atomikos.icatch.max_timeout = 300000
94 [main] INFO atomikos - USING com.atomikos.icatch.tm_unique_name = PaymentsTransactions
94 [main] INFO atomikos - USING java.naming.factory.initial = com.sun.jndi.rmi.registry.RegistryContextFactory
94 [main] INFO atomikos - USING java.naming.provider.url = rmi://localhost:1099
94 [main] INFO atomikos - USING com.atomikos.icatch.service = com.atomikos.icatch.standalone.UserTransactionServiceFactory
94 [main] INFO atomikos - USING com.atomikos.icatch.force_shutdown_on_vm_exit = false
94 [main] INFO atomikos - USING com.atomikos.icatch.default_jta_timeout = 10000
INFO - JtaTransactionManager.checkUserTransactionAndTransactionManager(469) | Using JTA UserTransaction: com.atomikos.icatch.jta.UserTransactionImp@16a6027
INFO - JtaTransactionManager.checkUserTransactionAndTransactionManager(480) | Using JTA TransactionManager: com.atomikos.icatch.jta.UserTransactionManager@e68513
DEBUG - NameMatchTransactionAttributeSource.addTransactionalMethod(94) | Adding transactional method [*] with attribute [PROPAGATION_REQUIRED,ISOLATION_DEFAULT]
DEBUG - AbstractPlatformTransactionManager.getTransaction(365) | Creating new transaction with name [com.evolvus.payments.manager.IPaymentsManager.findColumnChartDisplayByGateWays]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
40500 [http-8080-Processor24] WARN atomikos - Attempt to create a transaction with a timeout that exceeds com.atomikos.icatch.max_timeout - truncating to: 300000
40641 [http-8080-Processor24] INFO atomikos - THREADS: using JDK thread pooling...
40703 [http-8080-Processor24] INFO atomikos - createCompositeTransaction ( 3000000 ): created new ROOT transaction with id PaymentsTransactions0000100688
DEBUG - AbstractPlatformTransactionManager.handleExistingTransaction(470) | Participating in existing transaction
DEBUG - AbstractPlatformTransactionManager.handleExistingTransaction(470) | Participating in existing transaction
DEBUG - AbstractPlatformTransactionManager.processRollback(850) | Participating transaction failed - marking existing transaction as rollback-only
DEBUG - JtaTransactionManager.doSetRollbackOnly(1060) | Setting JTA transaction rollback-only
49110 [http-8080-Processor24] INFO atomikos - setRollbackOnly() called for transaction PaymentsTransactions0000100688
DEBUG - AbstractPlatformTransactionManager.processRollback(843) | Initiating transaction rollback
49172 [http-8080-Processor24] INFO atomikos - afterCompletion ( STATUS_ROLLEDBACK ) called on Synchronization: org.hibernate.transaction.CacheSynchronization
49172 [http-8080-Processor24] INFO atomikos - afterCompletion ( STATUS_ROLLEDBACK ) called on Synchronization: org.hibernate.ejb.EntityManagerImpl$1@1f6e48a
49172 [http-8080-Processor24] INFO atomikos - rollback() done of transaction PaymentsTransactions0000100688
你能帮帮我吗?
最佳答案
很明显,您的数据库插入并未发生在事务管理器当前事务的范围内。
一些想法:
1) 也许它只是不在您的帖子中,但我没有在您的服务类上看到 Spring @Transactional 注释。您控制事务边界的策略是什么?
2) 因为您使用的是 JNDI,所以我们看不到您的数据源,但是如果您使用的是 Atomikos,您应该使用他们的 XA 感知池数据源。你是吗?
3) 您应该将 Atomikos 的正常日志记录增加到 DEBUG 以准确查看它正在处理哪些 SQL 命令。
4) Atomikos 保留您的普通日志文件之外的事务日志。这些用于恢复和其他目的。您还应该检查这些以获取线索。
希望这对您有所帮助。
更新:
MySQL 对 XA 事务有一些限制,您可以在这里了解 here .在您的 context.xml 中尝试此配置,至少看看它是否有效。它使用来自 Atomikos 的 XA 感知(但不支持 XA)数据源。如果这可行,那么您可以从那里开始:
<Transaction factory="com.atomikos.icatch.jta.UserTransactionFactory" />
并定义用于注入(inject)实体管理器的 JNDI 数据源:
<Resource name="jdbc/myDataSource" auth="Container"<br/>
factory="org.apache.naming.factory.BeanFactory"<br/>
type="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean"<br/>
uniqueResourceName="myMySqlDatabase" driverClassName="com.mysql.jdbc.Driver"
url="......" user="....." password="...."
maxPoolSize="20" reapTimeout="300" />
关于hibernate - 事务回滚,但插入了一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4447777/
什么是 hibernate 和n- hibernate ?我可以在 Visual Studio 2008 中使用它进行 C# Web 应用程序开发吗?请给我建议...我是 asp.net Web 应用
我有一个不系统地发生的异常(exception)。 我试图通过在每次迭代中刷新和清理 session 来解决此问题,但没有成功。 [quartzScheduler_Worker-7] ERROR jd
使用 Hibernate 在数据库中存储 IP 地址的最佳类型是什么? 我虽然是 Byte[] 或 String,但有没有更好的方法,或者你用什么? @Column(name = "range_fr
我正在尝试制定一个公式来选择用户个人资料的用户友好名称。它选择名字 + ' ' + 姓氏 如果其中至少有一个不为空且不为空(包含非空白字符),否则选择 短名称 (条件相同),最后,如果 短名称 为空或
在hibernate中,是否可以将鉴别器作为一个实体?例如,如果我将 Department 作为基类,将 AdminDepartment 和 ProcessingDepartment 作为子类。 De
我只想从表中获取一些列值。因此,我已经使用投影来实现这一目标。该代码有效,但我认为它无效。 我的问题是当我使用ProjectionsList并将标准条件列表设置为ArrayList时-Bulletin
你好: 我对 hibernate 缓存缓存的内容感到困惑。 从文档中,我知道 hibernate 中有缓存类型。 一级 :交易级别。 似乎要被 session 持久化的实体被缓存在这里。 二级缓存 :
我遇到了一个情况: save或update hibernate 的目标表中的某些数据 在目标表上有一个触发器,该触发器将在目标表的insert或update操作之前执行 由 hibernate 将此记
我有一个名为 Master_Info_tbl 的表。它是一个查询表: 这是该表的代码: @Entity @Table(name="MASTER_INFO_T") public class Code
我想知道如何在 Hibernate 查询语言中使用日期文字。我在我的 JPA 项目中做了如下操作(作为 Eclipselink 提供者)并且它工作正常。 SELECT m FROM Me m WHER
@Entity public class Troop { @OneToMany(mappedBy="troop") public Set getSoldiers() { ...
我正在尝试使用 hibernate 查询删除表 'user_role' 中的所有行。但每次我都会出错。有人可以帮我吗。 DaoImpl @Override public void deleteAll(
不是将数据库操作分散在四个 (osgi) 包中,而是在那里做略有不同的事情。我想创建一个负责所有持久性问题的(简单的)OSGi 包。我觉得这并不像听起来那么简单,因为“每个包都有独特的类加载器”。 因
这就是我使用生成器的方式: private Integer id; 我看到的行为是: 创建第一个对象 hibernate 分配 id = 1 删除该对象 关闭服务
对象级别的实体和值类型有什么区别。我知道实体将有一个 id 但值不会,但为什么我们需要不同的方法来映射实体与值类型? 这样做是为了让hibernate可以对值类型应用任何优化吗? 最佳答案 一个实体已
我正在使用 HibernateTemplate.findByCriteria 方法进行一些查询。现在我想在标准上创建一些 SQL 限制,比如 criteria.add(Restrictions.sql
所以我有以下代码: Query query = session.createQuery("from Weather"); List list = query.list();
如何使用Hibernate映射具有多个实体的 View ? 问候, 混沌 最佳答案 请参见Hibernate文档中第5.1.3节“类”,紧接在“Id”节之前: There is no differen
据我所知,Hibernate 有两种类型的实现 JPA的实现(2)(@Entity,@Table注解) 扩展到旧的(传统的) hibernate (没有 JPA),使用 HSQL 查询,没有注释 如果
我需要一个将条目存储为键值对的集合(因此我可以通过键查找值),但我需要一个允许多个值使用 hibernate 共享同一个键的集合 最佳答案 一个键具有多个值的映射称为多映射 - 在 Apache 公共
我是一名优秀的程序员,十分优秀!