1

J'ai un grain de gestionnaire de transactions dans mon xml comme suit:Comment faire la gestion des transactions sans utiliser les annotations @Transactional

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

et usine session et de source de données haricots comme:

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
    <property name="URL" value="jdbc:oracle:thin:@localhost:1521:XE"/> 
    <property name="user" value="user"/> 
    <property name="password" value="password"/> 
</bean> 

<!-- Hibernate SessionFactory --> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 

avec la session usine ayant tous les fichiers hbm cartographie.

J'ai maintenant UserAddressManagerImpl comme suit:

public class UserAddressManagerImpl implements UserAddressManager{ 
// methods to read and write in the database 
} 

et le haricot en est:

<bean id="userAddressManager" class="com.sodiz.service.impl.UserAddressManagerImpl"> 

Maintenant, ce UserAddressManagerImpl n'a pas de @Transactional sur elle.

Chaque fois que j'effectue une opération de lecture à partir de cette classe, cela fonctionne bien, mais en cas d'opération d'écriture, elle échoue. J'utilise cette classe empaquetée dans un pot. Donc je préfère ne pas changer cette classe.

Alors, est-il possible d'effectuer les opérations de lecture et d'écriture sans utiliser les annotations @Transactional?

+0

Avez-vous essayé d'utiliser la configuration XML? https://stackoverflow.com/questions/36917842/spring-transactional-configuring-xml –

Répondre

1

Vous devez utiliser les aspects pour y parvenir sans utiliser les annotations:

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<bean id="userAddressManager" class="com.sodiz.service.impl.UserAddressManagerImpl"/> 

<tx:advice id="txAdvice" transaction-manager="txManager"> 
     <tx:attributes> 
      <tx:method name="get*" read-only="true"/> 
      <tx:method name="find*" read-only="true"/> 
      <tx:method name="*"/> 
     </tx:attributes> 
</tx:advice> 

<aop:config> 
    <aop:pointcut id="userAddressManagerOperation" 
     expression="execution(* com.sodiz.service.impl.UserAddressManagerImpl.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="userAddressManagerOperation"/> 
</aop:config> 

Bien sûr, vous pouvez utiliser plus wilcards afin que chaque service dans votre package applique aux paramètres transactionnels ci-dessus.

+0

J'ai essayé cette solution après avoir ajouté les dépendances pom. Maintenant, il me donne une erreur de java.lang.VerifyError. Tomber de la fin du code. – Tarun

+0

assurez-vous d'avoir ceux-ci définis dans votre balise beans: xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http://www.springframework.org/schema/tx " –

+0

J'ai déjà des xmlns: aop =" http://www.springframework.org/schema/aop " et xmlns: tx =" http://www.springframework.org/schema/tx "dans mon tag beans – Tarun