| 
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