Skip to content

Commit 7ecfaaa

Browse files
committed
HHH-19566 allow checking for load by key filters with generic session find
1 parent 23d12a6 commit 7ecfaaa

File tree

6 files changed

+103
-2
lines changed

6 files changed

+103
-2
lines changed

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,11 @@ public Collection<FilterDefinition> getAutoEnabledFilters() {
198198
return delegate.getAutoEnabledFilters();
199199
}
200200

201+
@Override
202+
public boolean hasLoadByKeyFilter() {
203+
return delegate.hasLoadByKeyFilter();
204+
}
205+
201206
@Override
202207
public boolean containsFetchProfileDefinition(String name) {
203208
return delegate.containsFetchProfileDefinition( name );

hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,9 @@ default JpaMetamodel getJpaMetamodel() {
286286
*/
287287
Collection<FilterDefinition> getAutoEnabledFilters();
288288

289+
@Incubating
290+
boolean hasLoadByKeyFilter();
291+
289292
/**
290293
* Obtain the {@link JdbcServices} service.
291294
*/

hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ public class SessionFactoryImpl implements SessionFactoryImplementor {
182182

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

187188
private final transient EventListenerGroups eventListenerGroups;
@@ -246,6 +247,9 @@ public SessionFactoryImpl(
246247
if ( filter.isAutoEnabled() ) {
247248
autoEnabledFilters.add( filter );
248249
}
250+
if ( filter.isAppliedToLoadByKey() ) {
251+
hasLoadByKeyFilter = true;
252+
}
249253
}
250254

251255
entityNameResolver = new CoordinatingEntityNameResolver( this, getInterceptor() );
@@ -962,6 +966,10 @@ public Collection<FilterDefinition> getAutoEnabledFilters() {
962966
return autoEnabledFilters;
963967
}
964968

969+
public boolean hasLoadByKeyFilter() {
970+
return hasLoadByKeyFilter;
971+
}
972+
965973
@Override
966974
public Set<String> getDefinedFilterNames() {
967975
return unmodifiableSet( filters.keySet() );

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/ManagedMappingType.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.internal.util.IndexedConsumer;
1414
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
1515
import org.hibernate.persister.collection.CollectionPersister;
16+
import org.hibernate.persister.entity.SingleTableEntityPersister;
1617
import org.hibernate.sql.results.graph.FetchOptions;
1718
import org.hibernate.sql.results.graph.FetchableContainer;
1819
import org.hibernate.type.descriptor.java.JavaType;
@@ -145,6 +146,9 @@ else if ( attributeMapping instanceof ToOneAttributeMapping toOneAttributeMappin
145146
}
146147
}
147148
}
149+
if ( onlyApplyForLoadByKey && this instanceof SingleTableEntityPersister persister ) {
150+
return persister.getFactory().hasLoadByKeyFilter();
151+
}
148152
return false;
149153
}
150154
}

hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3678,10 +3678,9 @@ public boolean isAffectedByEnabledFilters(
36783678
if ( filterHelper != null && loadQueryInfluencers.hasEnabledFilters() ) {
36793679
return filterHelper.isAffectedBy( loadQueryInfluencers.getEnabledFilters(), onlyApplyForLoadByKeyFilters )
36803680
|| isAffectedByEnabledFilters( new HashSet<>(), loadQueryInfluencers, onlyApplyForLoadByKeyFilters );
3681-
36823681
}
36833682
else {
3684-
return false;
3683+
return isAffectedByEnabledFilters( new HashSet<>(), loadQueryInfluencers, onlyApplyForLoadByKeyFilters );
36853684
}
36863685
}
36873686

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.where.annotations;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.JoinColumn;
10+
import jakarta.persistence.ManyToOne;
11+
import jakarta.persistence.Table;
12+
import org.hibernate.EntityFilterException;
13+
import org.hibernate.annotations.Filter;
14+
import org.hibernate.annotations.FilterDef;
15+
import org.hibernate.testing.orm.junit.DomainModel;
16+
import org.hibernate.testing.orm.junit.SessionFactory;
17+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
18+
import org.junit.jupiter.api.Test;
19+
20+
import static org.junit.Assert.assertNotNull;
21+
import static org.junit.jupiter.api.Assertions.fail;
22+
23+
@SessionFactory
24+
@DomainModel(annotatedClasses =
25+
{ManyToOneFilterTest.X.class,
26+
ManyToOneFilterTest.Y.class})
27+
class ManyToOneFilterTest {
28+
@Test void test(SessionFactoryScope scope) {
29+
scope.inTransaction(session -> {
30+
Y y = new Y();
31+
X x = new X();
32+
x.id = -1;
33+
y.x = x;
34+
session.persist(x);
35+
session.persist(y);
36+
});
37+
scope.inTransaction(session -> {
38+
Y y = session.find(Y.class, 0L);
39+
assertNotNull(y.x);
40+
});
41+
try {
42+
scope.inTransaction( session -> {
43+
session.enableFilter( "filter" ).validate();
44+
var graph = session.createEntityGraph(Y.class);
45+
Y y = session.find( graph, 0L );
46+
} );
47+
fail();
48+
}
49+
catch (EntityFilterException efe) {
50+
//required
51+
}
52+
try {
53+
scope.inTransaction(session -> {
54+
session.enableFilter( "filter" ).validate();
55+
Y y = session.find(Y.class, 0L);
56+
});
57+
fail();
58+
}
59+
catch (EntityFilterException efe) {
60+
//required
61+
}
62+
}
63+
64+
@Entity
65+
@Table(name = "XX")
66+
@FilterDef(name = "filter", applyToLoadByKey = true)
67+
@Filter(name = "filter", condition = "id>0")
68+
static class X {
69+
@Id
70+
long id;
71+
}
72+
@Entity
73+
@Table(name = "YY")
74+
static class Y {
75+
@Id
76+
long id;
77+
String name;
78+
@ManyToOne
79+
@JoinColumn(name = "xx")
80+
X x;
81+
}
82+
}

0 commit comments

Comments
 (0)