|
9 | 9 | import org.checkerframework.checker.nullness.qual.NonNull; |
10 | 10 | import org.hibernate.context.spi.CurrentTenantIdentifierResolver; |
11 | 11 | import org.hibernate.context.spi.TenantSchemaMapper; |
| 12 | +import org.hibernate.dialect.SQLServerDialect; |
| 13 | +import org.hibernate.dialect.SybaseASEDialect; |
12 | 14 | import org.hibernate.relational.SchemaManager; |
13 | | -import org.hibernate.annotations.TenantId; |
| 15 | +import org.hibernate.testing.orm.junit.DialectFeatureChecks; |
14 | 16 | import org.hibernate.testing.orm.junit.EntityManagerFactoryScope; |
| 17 | +import org.hibernate.testing.orm.junit.JiraKey; |
15 | 18 | import org.hibernate.testing.orm.junit.Jpa; |
| 19 | +import org.hibernate.testing.orm.junit.RequiresDialectFeature; |
16 | 20 | import org.hibernate.testing.orm.junit.Setting; |
| 21 | +import org.hibernate.testing.orm.junit.SkipForDialect; |
17 | 22 | import org.junit.jupiter.api.Test; |
18 | 23 |
|
19 | 24 | import static org.hibernate.cfg.MultiTenancySettings.MULTI_TENANT_IDENTIFIER_RESOLVER; |
20 | 25 | import static org.hibernate.cfg.MultiTenancySettings.MULTI_TENANT_SCHEMA_MAPPER; |
| 26 | +import static org.junit.jupiter.api.AssertionsKt.assertNotNull; |
| 27 | +import static org.junit.jupiter.api.AssertionsKt.assertNull; |
21 | 28 |
|
22 | 29 | @Jpa(annotatedClasses = {SchemaBasedMultitenancyTest.Person.class}, |
23 | 30 | integrationSettings = |
24 | 31 | {@Setting(name = MULTI_TENANT_SCHEMA_MAPPER, |
25 | 32 | value = "org.hibernate.orm.test.multitenancy.SchemaBasedMultitenancyTest$MyMapper"), |
26 | 33 | @Setting(name = MULTI_TENANT_IDENTIFIER_RESOLVER, |
27 | 34 | value = "org.hibernate.orm.test.multitenancy.SchemaBasedMultitenancyTest$MyResolver")}) |
| 35 | +@RequiresDialectFeature(feature = DialectFeatureChecks.SupportSchemaCreation.class) |
| 36 | +@SkipForDialect(dialectClass = SQLServerDialect.class, reason = "Warning: setSchema is a no-op in this driver version") |
| 37 | +@SkipForDialect(dialectClass = SybaseASEDialect.class, reason = "getSchema() method not implemented by jTDS") |
| 38 | +@JiraKey("HHH-19559") |
28 | 39 | public class SchemaBasedMultitenancyTest { |
| 40 | + private static String currentTenantIdentifier; |
| 41 | + |
29 | 42 | @Test void test(EntityManagerFactoryScope scope) { |
30 | 43 | var schemaManager = (SchemaManager) scope.getEntityManagerFactory().getSchemaManager(); |
31 | | - SchemaManager managerForTenantSchema = schemaManager.forSchema( "HELLO" ); |
32 | | - managerForTenantSchema.drop(true); |
33 | | - managerForTenantSchema.create( true ); |
| 44 | + createSchema( schemaManager, "HELLO" ); |
| 45 | + createSchema( schemaManager, "GOODBYE" ); |
| 46 | + currentTenantIdentifier = "hello"; |
34 | 47 | scope.inTransaction( session -> { |
35 | 48 | Person person = new Person(); |
36 | 49 | person.ssn = "123456789"; |
37 | | - person.tenantId = "hello"; |
38 | 50 | person.name = "Gavin"; |
39 | 51 | session.persist( person ); |
40 | 52 | } ); |
| 53 | + scope.inTransaction( session -> { |
| 54 | + assertNotNull( session.find( Person.class, "123456789" ) ); |
| 55 | + } ); |
| 56 | + currentTenantIdentifier = "goodbye"; |
| 57 | + scope.inTransaction( session -> { |
| 58 | + assertNull( session.find( Person.class, "123456789" ) ); |
| 59 | + } ); |
| 60 | + } |
| 61 | + |
| 62 | + private static void createSchema(SchemaManager schemaManager, String schemaName) { |
| 63 | + SchemaManager managerForTenantSchema = schemaManager.forSchema( schemaName ); |
| 64 | + managerForTenantSchema.drop(true); |
| 65 | + managerForTenantSchema.create( true ); |
41 | 66 | } |
42 | 67 |
|
43 | 68 | @Entity(name = "PersonForTenant") |
44 | 69 | static class Person { |
45 | 70 | @Id |
46 | 71 | String ssn; |
47 | | - @TenantId |
48 | | - String tenantId; |
49 | 72 | private String name; |
50 | 73 | } |
51 | 74 |
|
52 | 75 | public static class MyResolver implements CurrentTenantIdentifierResolver<String> { |
53 | 76 | @Override |
54 | 77 | public @NonNull String resolveCurrentTenantIdentifier() { |
55 | | - return "hello"; |
| 78 | + return currentTenantIdentifier; |
56 | 79 | } |
57 | 80 |
|
58 | 81 | @Override |
|
0 commit comments