Salut tous J'ai fait une configuration d'application en utilisant hybernate + JPA, et atomikos pour XA transcation management et spring 3.0 et mysql est mon backend, ici tout fonctionne bien mais opération d'insertion, sauf exception est de jeter la transcation devrait revenir en arrière, mais il ne se passe pas !! voici un petit flux pour notre application, dans notre niveau de gestion que nous appelons le businesss (ici, nous utilisons du CIO Spring) monL'annulation de transaction JPA ne fonctionne pas
Manager.java
insertuser()
{
//here we are getting transcation support from spring.
business.insertuser();
}
business.java nous utilisons une méthode 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.
}
et notre classe dao.java nous utilisons une méthode insertuser (entité objet)
void insertDetails(Object entity)
{
this.getJpaTemplate().persist(entity);
}
et notre 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>
et mon fichier persistence.xml est
<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>
et je configuré mon JNDI en application/meta_inf/context.xml
<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>
et mon fichier de configuration est 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>
où est le problème? En fait, lorsque j'essaie de mettre à jour une propriété dans une table, la transcation fonctionne correctement (annulation et validation), mais lorsque j'essaie de faire, l'annulation de l'opération d'insertion ne se produit pas.
Pouvez-vous fournir plus de votre code actuel (avec des choses spécifiques à l'entreprise supprimées bien sûr)? On dirait que la transaction est fermée et engagée après votre appel à l'OAC, ce qui n'est clairement pas ce que vous essayez de faire. –
Plus de code aidera. Surtout comment vous gérez les frontières de transaction? Il existe également une raison spécifique d'utiliser orm.xml. Vous ne pouvez pas utiliser l'annotation? – lalit
Impossible de dire ce qui se passe sans aucun journal. Les transactions printanières génèrent beaucoup d'informations de journalisation en mode débogage. Ajoutez 'log4j.logger.org.springframework.transaction = DEBUG' à votre config log4j (ou l'équivalent de ce que vous utilisez pour la consignation), et voyez si les transactions sont réellement utilisées. C'est votre meilleure option pour déboguer ce genre de choses. Si vous avez encore des problèmes, mettez à jour votre message avec les informations. (En passant, vous pouvez modifier votre message pour ajouter des informations au lieu de l'afficher comme réponse.) – Henning