Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,11 @@ public Collection<FilterDefinition> getAutoEnabledFilters() {
return delegate.getAutoEnabledFilters();
}

@Override
public boolean hasLoadByKeyFilter() {
return delegate.hasLoadByKeyFilter();
}

@Override
public boolean containsFetchProfileDefinition(String name) {
return delegate.containsFetchProfileDefinition( name );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,9 @@ default JpaMetamodel getJpaMetamodel() {
*/
Collection<FilterDefinition> getAutoEnabledFilters();

@Incubating
boolean hasLoadByKeyFilter();

/**
* Obtain the {@link JdbcServices} service.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ public class SessionFactoryImpl implements SessionFactoryImplementor {

private final transient Map<String, FilterDefinition> filters;
private final transient Collection<FilterDefinition> autoEnabledFilters = new ArrayList<>();
private transient boolean hasLoadByKeyFilter = false;
private final transient JavaType<Object> tenantIdentifierJavaType;

private final transient EventListenerGroups eventListenerGroups;
Expand Down Expand Up @@ -246,6 +247,9 @@ public SessionFactoryImpl(
if ( filter.isAutoEnabled() ) {
autoEnabledFilters.add( filter );
}
if ( filter.isAppliedToLoadByKey() ) {
hasLoadByKeyFilter = true;
}
}

entityNameResolver = new CoordinatingEntityNameResolver( this, getInterceptor() );
Expand Down Expand Up @@ -962,6 +966,10 @@ public Collection<FilterDefinition> getAutoEnabledFilters() {
return autoEnabledFilters;
}

public boolean hasLoadByKeyFilter() {
return hasLoadByKeyFilter;
}

@Override
public Set<String> getDefinedFilterNames() {
return unmodifiableSet( filters.keySet() );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.hibernate.internal.util.IndexedConsumer;
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.SingleTableEntityPersister;
import org.hibernate.sql.results.graph.FetchOptions;
import org.hibernate.sql.results.graph.FetchableContainer;
import org.hibernate.type.descriptor.java.JavaType;
Expand Down Expand Up @@ -145,6 +146,9 @@ else if ( attributeMapping instanceof ToOneAttributeMapping toOneAttributeMappin
}
}
}
if ( onlyApplyForLoadByKey && this instanceof SingleTableEntityPersister persister ) {
return persister.getFactory().hasLoadByKeyFilter();
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3678,10 +3678,9 @@ public boolean isAffectedByEnabledFilters(
if ( filterHelper != null && loadQueryInfluencers.hasEnabledFilters() ) {
return filterHelper.isAffectedBy( loadQueryInfluencers.getEnabledFilters(), onlyApplyForLoadByKeyFilters )
|| isAffectedByEnabledFilters( new HashSet<>(), loadQueryInfluencers, onlyApplyForLoadByKeyFilters );

}
else {
return false;
return isAffectedByEnabledFilters( new HashSet<>(), loadQueryInfluencers, onlyApplyForLoadByKeyFilters );
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.orm.test.where.annotations;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import org.hibernate.EntityFilterException;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.testing.orm.junit.DomainModel;
import org.hibernate.testing.orm.junit.SessionFactory;
import org.hibernate.testing.orm.junit.SessionFactoryScope;
import org.junit.jupiter.api.Test;

import static org.junit.Assert.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;

@SessionFactory
@DomainModel(annotatedClasses =
{ManyToOneFilterTest.X.class,
ManyToOneFilterTest.Y.class})
class ManyToOneFilterTest {
@Test void test(SessionFactoryScope scope) {
scope.inTransaction(session -> {
Y y = new Y();
X x = new X();
x.id = -1;
y.x = x;
session.persist(x);
session.persist(y);
});
scope.inTransaction(session -> {
Y y = session.find(Y.class, 0L);
assertNotNull(y.x);
});
try {
scope.inTransaction( session -> {
session.enableFilter( "filter" ).validate();
var graph = session.createEntityGraph(Y.class);
Y y = session.find( graph, 0L );
} );
fail();
}
catch (EntityFilterException efe) {
//required
}
try {
scope.inTransaction(session -> {
session.enableFilter( "filter" ).validate();
Y y = session.find(Y.class, 0L);
});
fail();
}
catch (EntityFilterException efe) {
//required
}
}

@Entity
@Table(name = "XX")
@FilterDef(name = "filter", applyToLoadByKey = true)
@Filter(name = "filter", condition = "id>0")
static class X {
@Id
long id;
}
@Entity
@Table(name = "YY")
static class Y {
@Id
long id;
String name;
@ManyToOne
@JoinColumn(name = "xx")
X x;
}
}