Bonjour,

J'utilise Spring 2.5.4 et JPA (implémentation : Oracle TopLink Essentials - 2006.8 (Build 060829)) dans un projet où Spring gére (entres autres) les transactions.

Pour la gestion des transactions j'utilise les types de propagations :
  • REQUIRED
  • REQUIRES_NEW
  • SUPPORTS


Mon probléme est la configuration du gestionnaire transactionnel (GT) dans le cas où je désire utiliser un gestionnaire transactionnel JTA pour un déploiement vers un serveur d'application Oracle OC4J 10.1.3.1.

Si j'utilise le GT "org.springframework.orm.jpa.JpaTransactionManager" tout fonctionne correctement mais lorsque je reconfigure le GT vers JTA via la balise <tx:jta-transaction-manager />, alors le déploiement s'effectue correctement, le contexte Spring se charge correctement MAIS à la première utilisation d'une fonctionnalité qui nécessite une transaction, JPA léve l'exception suivante :
javax.persistence.TransactionRequiredException: Exception Description: No transaction is currently active !

J'ai cherché sur divers forums dont celui de Spring mais je n'arrive à trouver quelle est mon erreur dans ma configuration ?

Je place ci-dessous le code du fichier de configuration 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
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
 
<?xml version="1.0" encoding="UTF-8"?>
<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:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
			http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
 
	<!--
		****************************************************************************
		Spring configuration file for :
		-> The datasource
		-> The ORM (JPA)
		-> The transactions
		****************************************************************************
	-->
 
 
	<!-- ========================= DATASOURCE ========================= -->
		<bean id="dataSource"
		class="org.springframework.jndi.JndiObjectFactoryBean"
		p:jndiName="jdbc/PweDS" />
 
	<!-- ========================= ORM : JPA ========================= -->
	<!--
		Activates a load-time weaver for the context. Any bean within the context that
		implements LoadTimeWeaverAware (such as LocalContainerEntityManagerFactoryBean)
		will receive a reference to the autodetected load-time weaver.
	-->
	<context:load-time-weaver />
	<bean id="loadTimeWeaver"
		class="org.springframework.instrument.classloading.oc4j.OC4JLoadTimeWeaver" />
 
	<!-- JPA PersistenceUnitManager used to customize the selection of the persistence unit and the datasources -->
	<bean id="persistenceUnitManager"
		class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
		<!-- Multiple value can be specified here -->
		<property name="persistenceXmlLocations">
			<list>
				<value>classpath*:META-INF/persistence.xml</value>
			</list>
		</property>
		<property name="dataSources">
			<map>
				<entry key="localDataSource" value-ref="dataSource" />
				<!--<entry key="remoteDataSource" value-ref="remote-db" />-->
			</map>
		</property>
		<!-- if no datasource is specified, use this one -->
		<property name="defaultDataSource" ref="dataSource" />
		<property name="loadTimeWeaver" ref="loadTimeWeaver" />
	</bean>
 
	<!-- JPA EntityManagerFactory -->
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
		p:dataSource-ref="dataSource"
		p:persistenceUnitManager-ref="persistenceUnitManager">
		<property name="jpaVendorAdapter">
			<bean
				class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter"
				p:databasePlatform="oracle.toplink.essentials.platform.database.oracle.OraclePlatform">
				<property name="showSql" value="${pwe.log.showsql}" />
			</bean>
		</property>
		<property name="jpaDialect">
			<bean
				class="org.springframework.orm.jpa.vendor.TopLinkJpaDialect" />
		</property>
	</bean>
 
	<!-- JTA Transaction Manager -->
	<tx:jta-transaction-manager />
 
 
 
 
	<context:annotation-config />
	<bean
		class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
 
 
 
 
	<!-- ================================== TRANSACTIONS ================================== -->
	<!-- For the moment JPA only support ISOLATION_DEFAULT for the transaction isolation -->
 
	<!-- Note : 	
		The Transport layer do not intialize transactions in order to enhance the transport layer modularity from HTTP to JMS 
	-->
 
	<!-- Define pointcut for txAdvices -->
	<aop:config>
		<!-- DAO Layer -->
		<aop:advisor advice-ref="txAdviceDao"
			pointcut="execution(* eu.curia.pwe.dao.impl.*.*(..))" />
		<!-- Service Layer -->
		<aop:advisor advice-ref="txAdviceService"
			pointcut="execution(* eu.curia.pwe.service..*.*(..))" />
	</aop:config>
 
	<!-- the transactional advice for DAO layer -->
	<tx:advice id="txAdviceDao" transaction-manager="transactionManager">
		<!-- the transactional semantics... -->
		<tx:attributes>
			<!-- Read methods don''t use a transaction but supports an existing transaction -->
			<tx:method name="read*" propagation="SUPPORTS"
				read-only="false" />
			<!-- Exclude Getter/Setter but supports an existing transaction -->
			<tx:method name="set*" propagation="SUPPORTS"
				read-only="false" />
			<tx:method name="get*" propagation="SUPPORTS"
				read-only="false" />
			<!-- All others methods must use a existing transaction -->
			<tx:method name="*" isolation="DEFAULT"
				propagation="MANDATORY" read-only="false"
				rollback-for="org.springframework.dao.DataAccessException eu.curia.pwe.error.PWEException" />
		</tx:attributes>
	</tx:advice>
 
	<!-- the transactional advice for Service layer 
	-->
	<tx:advice id="txAdviceService" transaction-manager="transactionManager">
		<!-- the transactional semantics... -->
		<tx:attributes>
			<!-- Read methods don''t use a transaction but supports an existing transaction -->
			<tx:method name="read*" propagation="SUPPORTS"
				read-only="false" />
			<!-- Exclude Getter/Setter but supports an existing transaction -->
			<tx:method name="set*" propagation="SUPPORTS"
				read-only="false" />
			<tx:method name="get*" propagation="SUPPORTS"
				read-only="false" />
			<!-- Update method create new transaction -->
			<tx:method name="update*" propagation="REQUIRES_NEW"
				read-only="false" />
			<!-- All others methods create a new transaction only if no transaction exists -->
			<tx:method name="*" isolation="DEFAULT"
				propagation="REQUIRED" read-only="false"
				rollback-for="org.springframework.dao.DataAccessException eu.curia.pwe.error.PWEException" />
		</tx:attributes>
	</tx:advice>
 
</beans>
Merci d'avance de vos lumiéres

Dominique