diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/discriminator/MultitenancyJoinedStrategyQueryTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/discriminator/MultitenancyJoinedStrategyQueryTest.java new file mode 100644 index 000000000000..9931863e0f8f --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/discriminator/MultitenancyJoinedStrategyQueryTest.java @@ -0,0 +1,50 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.multitenancy.discriminator; + +import org.hibernate.bugs.entity.MultitenantChildEntity; +import org.hibernate.bugs.entity.MultitenantParentEntity; +import org.hibernate.bugs.entity.MultitenantReferenceEntity; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.ServiceRegistry; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.hibernate.testing.orm.junit.Setting; +import org.junit.jupiter.api.Test; + +import java.util.List; + + +@DomainModel( + annotatedClasses = { + MultitenantChildEntity.class, + MultitenantParentEntity.class, + MultitenantReferenceEntity.class + } +) +@ServiceRegistry( + settings = { + @Setting(name = AvailableSettings.SHOW_SQL, value = "true"), + @Setting(name = AvailableSettings.FORMAT_SQL, value = "true"), + @Setting(name = AvailableSettings.MULTI_TENANT_IDENTIFIER_RESOLVER, + value = "org.hibernate.orm.test.multitenancy.discriminator.resolver.TenantResolver"), + } +) +@SessionFactory +class MultitenancyJoinedStrategyQueryTest { + + @Test + void hhh123Test(SessionFactoryScope scope) { + scope.inTransaction( session -> { + List results = session.createSelectionQuery( + "from MultitenantReferenceEntity r where r.child.number = :number", + MultitenantReferenceEntity.class ) + .setParameter( "number", 7 ) + .getResultList(); + // no exception is thrown + } ); + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/discriminator/resolver/TenantResolver.java b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/discriminator/resolver/TenantResolver.java new file mode 100644 index 000000000000..849cacf77a07 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/discriminator/resolver/TenantResolver.java @@ -0,0 +1,19 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.multitenancy.discriminator.resolver; + +import org.hibernate.context.spi.CurrentTenantIdentifierResolver; + +public class TenantResolver implements CurrentTenantIdentifierResolver { + @Override + public Long resolveCurrentTenantIdentifier() { + return 1L; + } + + @Override + public boolean validateExistingCurrentSessions() { + return false; + } + } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantChildEntity.java b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantChildEntity.java new file mode 100644 index 000000000000..7b4794b33dc4 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantChildEntity.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.bugs.entity; + + +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.OneToMany; + +import java.util.List; + +@Entity +@DiscriminatorValue("CHILD") +public class MultitenantChildEntity extends MultitenantParentEntity { +Long number; + +@OneToMany(mappedBy = "child", fetch = FetchType.LAZY, orphanRemoval = true) +List references; +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantParentEntity.java b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantParentEntity.java new file mode 100644 index 000000000000..bb799b67611e --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantParentEntity.java @@ -0,0 +1,29 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.bugs.entity; + + +import jakarta.persistence.DiscriminatorColumn; +import jakarta.persistence.DiscriminatorType; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; +import org.hibernate.annotations.TenantId; + +@Entity +@Inheritance(strategy = InheritanceType.JOINED) +@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "entity_type") +public class MultitenantParentEntity { +@Id +@GeneratedValue +Long id; + +@TenantId +Long tenantId; + +String entityType; +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantReferenceEntity.java b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantReferenceEntity.java new file mode 100644 index 000000000000..52807401f327 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/multitenancy/schema/MultitenantReferenceEntity.java @@ -0,0 +1,21 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.bugs.entity; + + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; + +@Entity +public class MultitenantReferenceEntity { +@Id +@GeneratedValue +Long id; + +@ManyToOne() +MultitenantChildEntity child; +}