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