@@ -137,12 +137,15 @@ public Object beginTransaction(EntityManager entityManager, TransactionDefinitio
137
137
session .getTransaction ().setTimeout (definition .getTimeout ());
138
138
}
139
139
140
- Integer previousIsolationLevel = null ;
141
140
boolean isolationLevelNeeded = (definition .getIsolationLevel () != TransactionDefinition .ISOLATION_DEFAULT );
141
+ Integer previousIsolationLevel = null ;
142
+ boolean resetConnection = false ;
143
+
142
144
if (isolationLevelNeeded || definition .isReadOnly ()) {
143
145
if (this .prepareConnection ) {
144
146
Connection con = HibernateConnectionHandle .doGetConnection (session );
145
147
previousIsolationLevel = DataSourceUtils .prepareConnectionForTransaction (con , definition );
148
+ resetConnection = true ;
146
149
}
147
150
else if (isolationLevelNeeded ) {
148
151
throw new InvalidIsolationLevelException (getClass ().getSimpleName () +
@@ -156,36 +159,37 @@ else if (isolationLevelNeeded) {
156
159
entityManager .getTransaction ().begin ();
157
160
158
161
// Adapt flush mode and store previous isolation level, if any.
159
- return doPrepareTransaction (session , definition .isReadOnly (), previousIsolationLevel );
162
+ FlushMode previousFlushMode = prepareFlushMode (session , definition .isReadOnly ());
163
+ return new SessionTransactionData (session , previousFlushMode , resetConnection , previousIsolationLevel );
160
164
}
161
165
162
166
@ Override
163
167
public Object prepareTransaction (EntityManager entityManager , boolean readOnly , String name )
164
168
throws PersistenceException {
165
169
166
- return doPrepareTransaction (getSession (entityManager ), readOnly , null );
170
+ Session session = getSession (entityManager );
171
+ FlushMode previousFlushMode = prepareFlushMode (session , readOnly );
172
+ return new SessionTransactionData (session , previousFlushMode , false , null );
167
173
}
168
174
169
- protected Object doPrepareTransaction (Session session , boolean readOnly , Integer previousIsolationLevel )
170
- throws PersistenceException {
171
-
175
+ protected FlushMode prepareFlushMode (Session session , boolean readOnly ) throws PersistenceException {
172
176
FlushMode flushMode = session .getFlushMode ();
173
- FlushMode previousFlushMode = null ;
174
177
if (readOnly ) {
175
178
// We should suppress flushing for a read-only transaction.
176
- session .setFlushMode (FlushMode .MANUAL );
177
- previousFlushMode = flushMode ;
179
+ if (!flushMode .equals (FlushMode .MANUAL )) {
180
+ session .setFlushMode (FlushMode .MANUAL );
181
+ return flushMode ;
182
+ }
178
183
}
179
184
else {
180
185
// We need AUTO or COMMIT for a non-read-only transaction.
181
186
if (flushMode .lessThan (FlushMode .COMMIT )) {
182
187
session .setFlushMode (FlushMode .AUTO );
183
- previousFlushMode = flushMode ;
188
+ return flushMode ;
184
189
}
185
190
}
186
-
187
- boolean resetConnection = (previousIsolationLevel != null || readOnly );
188
- return new SessionTransactionData (session , previousFlushMode , resetConnection , previousIsolationLevel );
191
+ // No FlushMode change needed...
192
+ return null ;
189
193
}
190
194
191
195
@ Override
@@ -299,8 +303,8 @@ protected DataAccessException convertHibernateAccessException(HibernateException
299
303
return new JpaSystemException (ex );
300
304
}
301
305
302
- protected Session getSession (EntityManager em ) {
303
- return em .unwrap (Session .class );
306
+ protected Session getSession (EntityManager entityManager ) {
307
+ return entityManager .unwrap (Session .class );
304
308
}
305
309
306
310
@@ -310,23 +314,23 @@ private static class SessionTransactionData {
310
314
311
315
private final FlushMode previousFlushMode ;
312
316
313
- private final boolean connectionReset ;
317
+ private final boolean resetConnection ;
314
318
315
319
private final Integer previousIsolationLevel ;
316
320
317
321
public SessionTransactionData (
318
322
Session session , FlushMode previousFlushMode , boolean resetConnection , Integer previousIsolationLevel ) {
319
323
this .session = session ;
320
324
this .previousFlushMode = previousFlushMode ;
321
- this .connectionReset = resetConnection ;
325
+ this .resetConnection = resetConnection ;
322
326
this .previousIsolationLevel = previousIsolationLevel ;
323
327
}
324
328
325
329
public void resetSessionState () {
326
330
if (this .previousFlushMode != null ) {
327
331
this .session .setFlushMode (this .previousFlushMode );
328
332
}
329
- if (this .connectionReset && this .session .isConnected ()) {
333
+ if (this .resetConnection && this .session .isConnected ()) {
330
334
Connection con = HibernateConnectionHandle .doGetConnection (this .session );
331
335
DataSourceUtils .resetConnectionAfterTransaction (con , this .previousIsolationLevel );
332
336
}
0 commit comments