Bonjour,
Je débute avec Spring 3.1.1/Hibernate 4.1.0/Struts 2.2.3.
Tout a l'air de bien fonctionner sauf que mes transactions (si elle se lance bien?) ne sont en fait jamais commité dans ma base de données. L'insertion d'une ressource ce passe bien aucun erreur, mais l'enregistrement en base ne se fait pas.
Voici mon applicationContext :
Mon applicationContext-ccr-hibernate.xml (qui se trouve dans un sous-module) :
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 <?xml version="1.0" encoding="ISO-8859-15"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- Import de la config hibernate/dao depuis le ccr-core --> <import resource="classpath:applicationContext-ccr-hibernate.xml"/> <!-- Activation des annotations --> <context:component-scan base-package="fr.cndp.ccr.core.dao"/> <context:component-scan base-package="fr.cndp.ccr.core.service"/> </beans>
Mon GenericDaoImpl.java :
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 <?xml version="1.0" encoding="ISO-8859-15"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <bean id="dataSourceCCR" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://javadev.cndp.lan:3306/ccrdb" /> <!--<property name="url" value="jdbc:mysql://localhost:3306/ccrdb" />--> <property name="username" value="db" /> <property name="password" value="toto" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" > <property name="dataSource" ref="dataSourceCCR" /> <property name="mappingLocations"> <value>classpath*:fr/cndp/ccr/core/modele/*.hbm.xml</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.id.new_generator_mappings">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.validator.apply_to_ddl">false</prop> <prop key="hibernate.connection.release_mode">after_transaction</prop> <!--<prop key="current_session_context_class">thread</prop>--> <prop key="hibernate.validator.autoregister_listeners">false</prop> <prop key="c3p0.acquire_increment">1</prop> <prop key="c3p0.min_size">1</prop> <prop key="c3p0.max_size">20</prop> <prop key="c3p0.timeout">0</prop> <prop key="c3p0.max_statements">0</prop> <prop key="c3p0.idle_test_period">3600</prop> </props> </property> </bean> <!-- Hibernate Transaction Manager Definition --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> <property name="dataSource" ref="dataSourceCCR" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" mode="aspectj"/> <aop:config proxy-target-class="true"/> </beans>
Mon implémentation du Dao RessourceImplDao.java :
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 package fr.cndp.ccr.core.dao; public abstract class GenericDAOImpl<T, K extends Serializable> implements GenericDAO<T, K> { protected static Logger logger; @Resource(name = "sessionFactory") private SessionFactory sessionFactory; private Session session; private Class type; public GenericDAOImpl(Class<T> leType) { type = leType; logger = Logger.getLogger(type); } /** * Permet de recuperer un T selon son id K * @param id * @return */ @Override public T find(K id) { return (T) getSession().get(type, id); } /** * Permet de recuperer la liste de tous les T * @return */ @Override public List<T> find() { Criteria crit = getSession().createCriteria(type); return crit.list(); } /** * Permet de recuper un ensemble de T en fonction d'un T exemple * @param example * @return */ @Override public List<T> find(T example) { return null; } /** * Permet d'enregistrer en base un nouveau T * @param instance * @return */ @Override public K save(T instance) { K reponse = (K) getSession().save(instance); return reponse; } public Session getSession() { if (session == null) { try { session = sessionFactory.getCurrentSession(); } catch (HibernateException e) { session = sessionFactory.openSession(); } } return this.session; //return SessionFactoryUtils.getSession(sessionFactory, allowCreate); } public void setSessionFactory(SessionFactory sessionFactory) { System.out.println("setSessionFactory : " + sessionFactory.toString()); this.sessionFactory = sessionFactory; } }
Mon service RessourceImpService.java que j'ai mis en Transactional, ce qui n'est visiblement pas suffisant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 @Repository public class RessourceImplDao extends GenericDAOImpl<RessourceImpl, Integer> { public RessourceImplDao() { super(RessourceImpl.class); } }
Merci d'avance pour toute aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @Service @Transactional public class RessourceImplService { @Autowired private RessourceImplDao ressourceImplDao; public void enregistrerRessource(RessourceImpl r) { ressourceImplDao.save(r); } }
Partager