16
16
17
17
package com .google .inject .persist .jpa ;
18
18
19
+ import static org .junit .Assert .assertThrows ;
20
+
19
21
import com .google .inject .Guice ;
20
22
import com .google .inject .Inject ;
21
23
import com .google .inject .Injector ;
29
31
import javax .persistence .NoResultException ;
30
32
import junit .framework .TestCase ;
31
33
32
- /** @author Dhanji R. Prasanna ([email protected] ) */
34
+ /**
35
+ * @author Dhanji R. Prasanna ([email protected] )
36
+ */
33
37
34
38
public class ManagedLocalTransactionsTest extends TestCase {
35
39
private Injector injector ;
@@ -41,7 +45,7 @@ public class ManagedLocalTransactionsTest extends TestCase {
41
45
public void setUp () {
42
46
injector = Guice .createInjector (new JpaPersistModule ("testUnit" ));
43
47
44
- //startup persistence
48
+ // startup persistence
45
49
injector .getInstance (PersistService .class ).start ();
46
50
}
47
51
@@ -57,7 +61,7 @@ public void testSimpleTransaction() {
57
61
EntityManager em = injector .getInstance (EntityManager .class );
58
62
assertFalse ("txn was not closed by transactional service" , em .getTransaction ().isActive ());
59
63
60
- //test that the data has been stored
64
+ // test that the data has been stored
61
65
Object result =
62
66
em .createQuery ("from JpaTestEntity where text = :text" )
63
67
.setParameter ("text" , UNIQUE_TEXT )
@@ -79,7 +83,7 @@ public void testSimpleTransactionWithMerge() {
79
83
EntityManager em = injector .getInstance (EntityManager .class );
80
84
assertFalse ("txn was not closed by transactional service" , em .getTransaction ().isActive ());
81
85
82
- //test that the data has been stored
86
+ // test that the data has been stored
83
87
assertTrue ("Em was closed after txn!" , em .isOpen ());
84
88
85
89
Object result =
@@ -100,7 +104,7 @@ public void testSimpleTransactionRollbackOnChecked() {
100
104
try {
101
105
injector .getInstance (TransactionalObject .class ).runOperationInTxnThrowingChecked ();
102
106
} catch (IOException e ) {
103
- //ignore
107
+ // ignore
104
108
injector .getInstance (UnitOfWork .class ).end ();
105
109
}
106
110
@@ -110,23 +114,21 @@ public void testSimpleTransactionRollbackOnChecked() {
110
114
"Previous EM was not closed by transactional service (rollback didnt happen?)" ,
111
115
em .getTransaction ().isActive ());
112
116
113
- //test that the data has been stored
114
- try {
115
- Object result =
116
- em .createQuery ("from JpaTestEntity where text = :text" )
117
- .setParameter ("text" , TRANSIENT_UNIQUE_TEXT )
118
- .getSingleResult ();
119
- injector .getInstance (UnitOfWork .class ).end ();
120
- fail ("a result was returned! rollback sure didnt happen!!!" );
121
- } catch (NoResultException e ) {
122
- }
117
+ // test that the data has been stored
118
+ assertThrows (
119
+ NoResultException .class ,
120
+ () ->
121
+ em .createQuery ("from JpaTestEntity where text = :text" )
122
+ .setParameter ("text" , TRANSIENT_UNIQUE_TEXT )
123
+ .getSingleResult ());
124
+ injector .getInstance (UnitOfWork .class ).end ();
123
125
}
124
126
125
127
public void testSimpleTransactionRollbackOnUnchecked () {
126
128
try {
127
129
injector .getInstance (TransactionalObject .class ).runOperationInTxnThrowingUnchecked ();
128
130
} catch (RuntimeException re ) {
129
- //ignore
131
+ // ignore
130
132
injector .getInstance (UnitOfWork .class ).end ();
131
133
}
132
134
@@ -135,15 +137,47 @@ public void testSimpleTransactionRollbackOnUnchecked() {
135
137
"Session was not closed by transactional service (rollback didnt happen?)" ,
136
138
em .getTransaction ().isActive ());
137
139
138
- try {
139
- Object result =
140
- em .createQuery ("from JpaTestEntity where text = :text" )
141
- .setParameter ("text" , TRANSIENT_UNIQUE_TEXT )
142
- .getSingleResult ();
143
- injector .getInstance (UnitOfWork .class ).end ();
144
- fail ("a result was returned! rollback sure didnt happen!!!" );
145
- } catch (NoResultException e ) {
146
- }
140
+ assertThrows (
141
+ NoResultException .class ,
142
+ () ->
143
+ em .createQuery ("from JpaTestEntity where text = :text" )
144
+ .setParameter ("text" , TRANSIENT_UNIQUE_TEXT )
145
+ .getSingleResult ());
146
+ injector .getInstance (UnitOfWork .class ).end ();
147
+ }
148
+
149
+ public void testSimpleTransactionRollbackPerformedManuallyWithoutException () {
150
+ injector .getInstance (TransactionalObject .class ).runOperationInTxnWithManualRollback ();
151
+
152
+ EntityManager em = injector .getInstance (EntityManager .class );
153
+ assertFalse (
154
+ "Session was not closed by transactional service (rollback didnt happen?)" ,
155
+ em .getTransaction ().isActive ());
156
+
157
+ assertThrows (
158
+ NoResultException .class ,
159
+ () ->
160
+ em .createQuery ("from JpaTestEntity where text = :text" )
161
+ .setParameter ("text" , TRANSIENT_UNIQUE_TEXT )
162
+ .getSingleResult ());
163
+ injector .getInstance (UnitOfWork .class ).end ();
164
+ }
165
+
166
+ public void testSimpleTransactionRollbackOnlySetWithoutException () {
167
+ injector .getInstance (TransactionalObject .class ).runOperationInTxnWithRollbackOnlySet ();
168
+
169
+ EntityManager em = injector .getInstance (EntityManager .class );
170
+ assertFalse (
171
+ "Session was not closed by transactional service (rollback didnt happen?)" ,
172
+ em .getTransaction ().isActive ());
173
+
174
+ assertThrows (
175
+ NoResultException .class ,
176
+ () ->
177
+ em .createQuery ("from JpaTestEntity where text = :text" )
178
+ .setParameter ("text" , TRANSIENT_UNIQUE_TEXT )
179
+ .getSingleResult ());
180
+ injector .getInstance (UnitOfWork .class ).end ();
147
181
}
148
182
149
183
public static class TransactionalObject {
@@ -185,5 +219,23 @@ public void runOperationInTxnThrowingUnchecked() {
185
219
186
220
throw new IllegalStateException ();
187
221
}
222
+
223
+ @ Transactional
224
+ public void runOperationInTxnWithManualRollback () {
225
+ JpaTestEntity entity = new JpaTestEntity ();
226
+ entity .setText (TRANSIENT_UNIQUE_TEXT );
227
+ em .persist (entity );
228
+
229
+ em .getTransaction ().rollback ();
230
+ }
231
+
232
+ @ Transactional
233
+ public void runOperationInTxnWithRollbackOnlySet () {
234
+ JpaTestEntity entity = new JpaTestEntity ();
235
+ entity .setText (TRANSIENT_UNIQUE_TEXT );
236
+ em .persist (entity );
237
+
238
+ em .getTransaction ().setRollbackOnly ();
239
+ }
188
240
}
189
241
}
0 commit comments