8
8
9
9
import org .hibernate .HibernateError ;
10
10
import org .hibernate .PropertyValueException ;
11
+ import org .hibernate .Session ;
11
12
import org .hibernate .StatelessSession ;
13
+ import org .hibernate .Transaction ;
12
14
import org .hibernate .boot .SessionFactoryBuilder ;
13
15
import org .hibernate .boot .spi .MetadataImplementor ;
14
16
import org .hibernate .context .spi .CurrentTenantIdentifierResolver ;
15
17
import org .hibernate .dialect .SybaseASEDialect ;
16
18
import org .hibernate .engine .spi .SessionFactoryImplementor ;
17
19
import org .hibernate .testing .orm .junit .DomainModel ;
20
+ import org .hibernate .testing .orm .junit .JiraKey ;
18
21
import org .hibernate .testing .orm .junit .ServiceRegistry ;
19
22
import org .hibernate .testing .orm .junit .SessionFactory ;
20
23
import org .hibernate .testing .orm .junit .SessionFactoryProducer ;
21
24
import org .hibernate .testing .orm .junit .SessionFactoryScope ;
22
25
import org .hibernate .testing .orm .junit .Setting ;
23
26
import org .hibernate .binder .internal .TenantIdBinder ;
27
+ import org .hibernate .query .Query ;
24
28
import org .hibernate .query .criteria .HibernateCriteriaBuilder ;
25
29
import org .hibernate .query .criteria .JpaCriteriaQuery ;
26
30
import org .hibernate .query .criteria .JpaRoot ;
@@ -57,11 +61,15 @@ public class TenantIdTest implements SessionFactoryProducer {
57
61
58
62
@ AfterEach
59
63
public void cleanup (SessionFactoryScope scope ) {
60
- scope .inTransaction ( session -> {
61
- session .createQuery ("delete from Account" ).executeUpdate ();
62
- session .createQuery ("delete from Client" ).executeUpdate ();
63
- session .createQuery ("delete from Record" ).executeUpdate ();
64
- });
64
+ // Use the root tenant to clean up all partitions
65
+ currentTenant = "root" ;
66
+ scope .inTransaction (
67
+ session -> {
68
+ session .createMutationQuery ( "delete from Account" ).executeUpdate ();
69
+ session .createMutationQuery ( "delete from Client" ).executeUpdate ();
70
+ session .createMutationQuery ( "delete from Record" ).executeUpdate ();
71
+ }
72
+ );
65
73
}
66
74
67
75
@ Override
@@ -96,25 +104,25 @@ public void test(SessionFactoryScope scope) {
96
104
} );
97
105
scope .inTransaction ( session -> {
98
106
assertNotNull ( session .find (Account .class , acc .id ) );
99
- assertEquals ( 1 , session .createQuery ("from Account" ).getResultList ().size () );
107
+ assertEquals ( 1 , session .createQuery ("from Account" , Account . class ).getResultList ().size () );
100
108
} );
101
109
assertEquals ("mine" , acc .tenantId );
102
110
103
111
currentTenant = "yours" ;
104
112
scope .inTransaction ( session -> {
105
113
assertNotNull ( session .find (Account .class , acc .id ) );
106
- assertEquals ( 0 , session .createQuery ("from Account" ).getResultList ().size () );
114
+ assertEquals ( 0 , session .createQuery ("from Account" , Account . class ).getResultList ().size () );
107
115
session .disableFilter (TenantIdBinder .FILTER_NAME );
108
116
assertNotNull ( session .find (Account .class , acc .id ) );
109
- assertEquals ( 1 , session .createQuery ("from Account" ).getResultList ().size () );
117
+ assertEquals ( 1 , session .createQuery ("from Account" , Account . class ).getResultList ().size () );
110
118
} );
111
119
}
112
120
113
121
@ Test
114
122
public void testRoot (SessionFactoryScope scope ) {
115
123
currentTenant = "root" ;
116
124
scope .inTransaction ( session -> {
117
- assertEquals ( 0 , session .createQuery ( "from Account" ).getResultList ().size () );
125
+ assertEquals ( 0 , session .createQuery ( "from Account" , Account . class ).getResultList ().size () );
118
126
} );
119
127
120
128
currentTenant = "mine" ;
@@ -127,14 +135,14 @@ public void testRoot(SessionFactoryScope scope) {
127
135
assertEquals ( "mine" , acc .tenantId );
128
136
scope .inTransaction ( session -> {
129
137
assertNotNull ( session .find ( Account .class , acc .id ) );
130
- assertEquals ( 1 , session .createQuery ( "from Account" ).getResultList ().size () );
138
+ assertEquals ( 1 , session .createQuery ( "from Account" , Account . class ).getResultList ().size () );
131
139
} );
132
140
133
141
currentTenant = "root" ;
134
142
// Root tenants should find entities from other tenants
135
143
scope .inTransaction ( session -> {
136
144
assertNotNull ( session .find ( Account .class , acc .id ) );
137
- assertEquals ( 1 , session .createQuery ( "from Account" ).getResultList ().size () );
145
+ assertEquals ( 1 , session .createQuery ( "from Account" , Account . class ).getResultList ().size () );
138
146
} );
139
147
140
148
// Root tenants should find entities from their own tenant
@@ -147,7 +155,7 @@ public void testRoot(SessionFactoryScope scope) {
147
155
assertEquals ( "root" , rootAcc .tenantId );
148
156
scope .inTransaction ( session -> {
149
157
assertNotNull ( session .find ( Account .class , rootAcc .id ) );
150
- assertEquals ( 2 , session .createQuery ( "from Account" ).getResultList ().size () );
158
+ assertEquals ( 2 , session .createQuery ( "from Account" , Account . class ).getResultList ().size () );
151
159
} );
152
160
}
153
161
@@ -292,6 +300,40 @@ public void tenantFilterWithStatelessSession(SessionFactoryScope scope) {
292
300
} );
293
301
}
294
302
303
+ @ Test
304
+ @ JiraKey ( value = "HHH-17972" )
305
+ public void testChangeTenantId (SessionFactoryScope scope ) {
306
+ currentTenant = "mine" ;
307
+ scope .inSession (
308
+ session -> {
309
+ Query <Client > sessionQuery = session .createQuery ( "from Client" , Client .class );
310
+
311
+ Transaction t = session .beginTransaction ();
312
+ session .persist ( new Client ("Gavin" ) );
313
+ t .commit ();
314
+ assertEquals (1 , sessionQuery .getResultList ().size () );
315
+ assertEquals ( "mine" , sessionQuery .getResultList ().get ( 0 ).tenantId );
316
+
317
+ Session newSession = session .sessionWithOptions ().tenantIdentifier ( "yours" ).connection ().openSession ();
318
+ Query <Client > newSessionQuery = newSession .createQuery ( "from Client" , Client .class );
319
+ t = newSession .beginTransaction ();
320
+ newSession .persist ( new Client ("Jan" ) );
321
+ t .commit ();
322
+
323
+ assertEquals (1 , newSessionQuery .getResultList ().size () );
324
+ assertEquals ( "yours" , newSessionQuery .getResultList ().get ( 0 ).tenantId );
325
+
326
+ session .disableFilter ( TenantIdBinder .FILTER_NAME );
327
+ assertEquals (2 , sessionQuery .getResultList ().size () );
328
+
329
+ newSession .disableFilter ( TenantIdBinder .FILTER_NAME );
330
+ assertEquals (2 , newSessionQuery .getResultList ().size () );
331
+
332
+ newSession .close ();
333
+ }
334
+ );
335
+ }
336
+
295
337
private static List <Record > listAllRecordsForTenant (StatelessSession session ) {
296
338
HibernateCriteriaBuilder criteriaBuilder = session .getCriteriaBuilder ();
297
339
JpaCriteriaQuery <Record > criteriaQuery = criteriaBuilder .createQuery ( Record .class );
0 commit comments