大家好 我已经使用hybernate + JPA进行了应用程序配置,并且使用了atomikos进行XA transcation管理和spring 3.0和mysql是我的后端,这里的每个东西都工作正常然而插入操作,当异常抛出transcation时应该回滚,但它没有发生! 这是我们应用程序的一个小流程,在我们的经理级别,我们正在调用业务(这里我们使用的是Spring IOC) 我的
Manager.java
insertuser()
{
//here we are getting transcation support from spring.
business.insertuser();
}
business.java我们正在使用一个方法insertuser()
insertuser()
{
Tauser taUser=new Tauser();
taUser.setUsername("Maya");
taUser.setPassword("*****")
Dao.insertDetails(taUser);
throw new NullPointerException("checking transcation management");
// because of this exception throwing,it should rollback right,
but its not happening.The property's are commiting in to the table.
}
和我们的dao.java类我们使用一个方法insertuser(Object entity)
void insertDetails(Object entity)
{
this.getJpaTemplate().persist(entity);
}
和我们的orm.xml
<entity class="TaUser" name="TaUser">
<table name="ta_user" />
<attributes>
<id name="userId">
<column name="USER_ID" />
<generated-value strategy="AUTO" />
</id>
<basic name="userName">
<column name="USER_NAME" length="50" />
</basic>
</attributes>
我的persistence.xml文件是
<persistence-unit name="shop" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:comp/env/jdbc/shobWeb</jta-data-source>
<mapping-file>META-INF/orm.xml</mapping-file>
<class>TaUser</class>
---------
---------
---------
<properties>
<property name="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
</properties>
</persistence-unit>
</persistence>
我在application / meta_inf / context.xml
中配置了我的jndi <Resource name="jdbc/shobWeb" 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/shobWebSample"
explicitUrl="true"
pinGlobalTxToPhysicalConnection="true"
></Resource>
我的配置文件是config.xml
<beans:bean id="Manager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<beans:property name="transactionManager">
<beans:ref bean="transactionManager" />
</beans:property>
<beans:property name="target">
<beans:ref local=" ManagerTarget" />
</beans:property>
<beans:property name="transactionAttributes">
<beans:props>
<beans:prop key="*">PROPAGATION_REQUIRED</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
<beans:bean id="ManagerTarget"
class="Manager">
<beans:property name="Business" ref="Business" />
</beans:bean>
<beans:bean id="Business" class="PaymentsBusiness">
<beans:property name="Dao" ref=" Dao" />
</beans:bean>
<beans:bean id="Dao"
class=" Dao">
<beans:property name="jpaTemplate">
<beans:ref bean="jpaTemplate" />
</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">
<beans:property name="persistenceUnitName" value="shop" />
<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:bean>
</beans:property>
<beans:property name="persistenceXmlLocation">
<bean:value>classpath:META-INF/persistence.xml</beans:value>
</beans:property>
</beans:bean>
问题在哪里?实际上,当我尝试更新表中的某些属性时,transcation工作正常(回滚和提交正在发生),但是当我尝试执行插入操作回滚时没有发生。
答案 0 :(得分:0)
我看的越多,它看起来就越混乱。
首先,AOP配置如何与您的实际方法相关?它的配置方式只会创建围绕以“save”或“remove”开头的方法的事务,以及围绕其他所有事务的只读事务。您的方法称为insertDetails
,因此无效。
其次,您是否配置了Spring PlatformTransactionManager
?我没有看到配置。
第三:看起来你正在使用类的默认包,但是为包com.live.webAppl
中的类定义了切入点。这是你的课程真正的地方吗?
第四:抛出异常时是否存在开放事务,插入方法是否参与了该事务?如果没有,那么就无法回滚。将调试器与日志输出一起使用,以查看创建事务的位置以及insert方法是否参与。尝试提高Atomikos的日志级别以进行调试。
第四,你是否陷入了Java 1.4代码库?否则,请转到annotational transaction declaration。 (在配置和代码中完成的很多方法看起来都有点过时了。)
第五,惯例是使用所有小写包名称。类以大写字母开头,成员和本地小写字母。这将有助于您的代码的可读性。 (例如,Dao.insertUser()
看起来像是对任何能够阅读Java的人的静态方法调用。不好。)