Bonjour à tous,
Débutant en spring et hibernate je profite de ce sujet pour vous faire part d'un problème lié aux transactions (en espérant ne pas me tromper de post ..)
J'utilise Spring 2.5.5 ,hibernate 3.2.1.ga , mysql et Tomcat
//interface de mon service
//implémentation de mon service
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public interface IFaxService { public IFaxModel saveFaxModel(IFaxModel faxModel); }
l'objet qui utilise mon service
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 @Service("faxServiceTarget") @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public class FaxService implements IFaxService { private IFaxDao faxDao; @Autowired public void setFaxDao(@Qualifier("faxDao") IFaxDao faxDao) { this.faxDao = faxDao; } public IFaxDao getFaxDao() { return faxDao; } public IFaxModel saveFaxModel(IFaxModel faxModel) { return getFaxDao().saveFaxModel(faxModel); } }
mon fichier de conf spring
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public class TestFaxFactory{ private IFaxService faxService; @Autowired public void setFaxService(@Qualifier("faxService") IFaxService faxService) { this.faxService = faxService; } public IFaxService getFaxService() { return faxService; } public void testSaveFaxMod(){ IFaxModel faxModel_1 = (IFaxModel) getXmlBeanFactory().getBean("faxModel_1"); faxModel_1 = getFaxService().saveFaxModel(faxModel_1); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tool" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <context:annotation-config/> <context:component-scan base-package="fax"/> <bean id="faxDao" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces" value="fax.dao.IFaxDao"/> <property name="interceptorNames"> <list> <value>faxDaoInterceptor</value> <value>faxDaoBean</value> </list> </property> </bean> <bean id="faxService" parent="transactionProxy"> <property name="target" ref="faxServiceTarget"/> <property name="transactionAttributeSource"> <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean> <bean id="transactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" scope="singleton"> <property name="configLocation" value="classpath:test.hibernate.cfg.xml"/> <property name="hibernateProperties"> <props> <prop key="hibernate.c3p0.autoCommitOnClose">true</prop> <prop key="hibernate.autoCommitOnClose">true</prop> <prop key="hibernate.autocommit">true</prop> <prop key="hibernate.connection.release_mode">auto</prop> <prop key="hibernate.transaction.auto_close_session">true</prop> </props> </property> </bean> </beans>
avec cette configuration le faxModel que je sauve est effectivement bien sauvé en base (je peux le voire via MySql browser ... )
Je voudrais avoir le moins possible de xml dans mon fichier spring. (d'ou les annotation dans mes classes)
Mes questions sont donc les suivantes :
Y a t il un moyen (annotations particulières , méthodes ou classes à implémenter ... ) pour ne pas avoir à définir les morceaux de codes suivant de mon fichier de conf spring :
et même dans l'absolue si il y a un moyen de ne pas avoir a définir dans le fichier de conf de spring la description du transactionProxy et du transactionManager
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <bean id="faxService" parent="transactionProxy"> <property name="target" ref="faxServiceTarget"/> <property name="transactionAttributeSource"> <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/> </property> </bean>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 <bean id="transactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean>j'ai bien essayé d'injecter directement mon service "faxServiceTarget" dans mon objet de test de la manière suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref local="sessionFactory"/> </property> </bean>
mais en faisant de la sorte, je n'ai plus de transaction et bien que je n'ai aucune erreur, mon faxModel n'est pas sauvegardé en base...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public class TestFaxFactory { [...] @Autowired public void setFaxService(@Qualifier("faxServiceTarget") IFaxService faxService) { this.faxService = faxService; [..] }
Une âme charitable aurait elle à défaut d'une solution , une piste à me proposer ?
MErci d'avance !
Partager