diff --git a/build/config/src/main/resources/forbidden-runtime.txt b/build/config/src/main/resources/forbidden-runtime.txt index 5d92f94d5b6..6b905edd985 100644 --- a/build/config/src/main/resources/forbidden-runtime.txt +++ b/build/config/src/main/resources/forbidden-runtime.txt @@ -65,6 +65,8 @@ org.hibernate.**.internal.** @defaultMessage Favor EntityManager methods over their Session equivalent org.hibernate.Session.save(java.lang.Object) @ Use persist() instead org.hibernate.Session.save(java.lang.String, java.lang.Object) @ Use persist() instead +org.hibernate.Session.update(java.lang.Object) @ Use merge() instead +org.hibernate.Session.update(java.lang.String, java.lang.Object) @ Use merge() instead org.hibernate.Session.load(java.lang.Class, java.lang.Object) @ Use getReference() instead org.hibernate.Session.delete(java.lang.Object) @ Use remove() instead org.hibernate.Session.delete(java.lang.String, java.lang.Object) @ Use remove() instead diff --git a/build/config/src/main/resources/forbidden-tests.txt b/build/config/src/main/resources/forbidden-tests.txt index 984b47c4a93..c97ca9dcc08 100644 --- a/build/config/src/main/resources/forbidden-tests.txt +++ b/build/config/src/main/resources/forbidden-tests.txt @@ -33,6 +33,9 @@ org.hibernate.tool.schema.Action @ Hibernate ORM doesn't support passing Action @defaultMessage Favor EntityManager methods over their Session equivalent org.hibernate.Session.save(java.lang.Object) @ Use persist() instead org.hibernate.Session.save(java.lang.String, java.lang.Object) @ Use persist() instead +# Allowed for test code: we need to test those methods. +#org.hibernate.Session.update(java.lang.Object) @ Use merge() instead +#org.hibernate.Session.update(java.lang.String, java.lang.Object) @ Use merge() instead org.hibernate.Session.load(java.lang.Class, java.lang.Object) @ Use getReference() instead org.hibernate.Session.delete(java.lang.Object) @ Use remove() instead org.hibernate.Session.delete(java.lang.String, java.lang.Object) @ Use remove() instead diff --git a/integrationtest/mapper/orm-coordination-outbox-polling/src/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/automaticindexing/OutboxPollingAutomaticIndexingEdgeCasesIT.java b/integrationtest/mapper/orm-coordination-outbox-polling/src/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/automaticindexing/OutboxPollingAutomaticIndexingEdgeCasesIT.java index 0bf7c364037..8e680173243 100644 --- a/integrationtest/mapper/orm-coordination-outbox-polling/src/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/automaticindexing/OutboxPollingAutomaticIndexingEdgeCasesIT.java +++ b/integrationtest/mapper/orm-coordination-outbox-polling/src/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/automaticindexing/OutboxPollingAutomaticIndexingEdgeCasesIT.java @@ -80,18 +80,14 @@ public void multipleChangesSameTransaction() { session.persist( entity3 ); entity1.setText( "initialValue II" ); - session.update( entity1 ); entity2.setText( "initialValue II" ); - session.update( entity2 ); entity3.setText( "initialValue II" ); - session.update( entity3 ); + session.flush(); entity1.setText( "initialValue III" ); - session.update( entity1 ); entity2.setText( "initialValue III" ); - session.update( entity2 ); entity3.setText( "initialValue III" ); - session.update( entity3 ); + session.flush(); backendMock.expectWorks( IndexedEntity.NAME ) .add( "1", b -> b diff --git a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/AutomaticIndexingBasicIT.java b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/AutomaticIndexingBasicIT.java index cf1f2a98829..1df2b5d3538 100644 --- a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/AutomaticIndexingBasicIT.java +++ b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/AutomaticIndexingBasicIT.java @@ -359,10 +359,11 @@ public void sessionClear() { } /** - * Test that merging an entity to change an indexed field + * Test that merging an entity using update() to change an indexed field * triggers reindexing of the indexed entity owning the property. */ @Test + @SuppressWarnings("deprecation") // This is specifically about "update", which is NOT strictly equivalent to "merge" public void sessionUpdate_directValueUpdate_indexedField() { setupHolder.runInTransaction( session -> { IndexedEntity entity1 = new IndexedEntity(); @@ -387,7 +388,7 @@ public void sessionUpdate_directValueUpdate_indexedField() { session.update( entity1 ); - // Hibernate ORM does not track dirtiness on merges: we assume everything is dirty. + // Hibernate ORM does not track dirtiness on calls to update(): we assume everything is dirty. backendMock.expectWorks( IndexedEntity.INDEX ) .addOrUpdate( "1", b -> b .field( "indexedField", entity1.getIndexedField() ) @@ -399,9 +400,10 @@ public void sessionUpdate_directValueUpdate_indexedField() { } /** - * Test that merging an entity to change an non-indexed field + * Test that merging an entity using update() to change a non-indexed field * triggers reindexing of the indexed entity owning the property: */ + @SuppressWarnings("deprecation") // This is specifically about "update", which is NOT strictly equivalent to "merge" @Test @TestForIssue(jiraKey = "HSEARCH-3199") public void sessionUpdate_directValueUpdate_nonIndexedField() { @@ -439,6 +441,78 @@ public void sessionUpdate_directValueUpdate_nonIndexedField() { backendMock.verifyExpectationsMet(); } + /** + * Test that merging an entity using merge() to change an indexed field + * triggers reindexing of the indexed entity owning the property. + */ + @Test + public void sessionMerge_directValueUpdate_indexedField() { + setupHolder.runInTransaction( session -> { + IndexedEntity entity1 = new IndexedEntity(); + entity1.setId( 1 ); + entity1.setIndexedField( "initialValue" ); + + session.persist( entity1 ); + + backendMock.expectWorks( IndexedEntity.INDEX ) + .add( "1", b -> b + .field( "indexedField", entity1.getIndexedField() ) + .field( "shallowReindexOnUpdateField", null ) + .field( "noReindexOnUpdateField", null ) + ); + } ); + backendMock.verifyExpectationsMet(); + + setupHolder.runInTransaction( session -> { + IndexedEntity entity1 = new IndexedEntity(); + entity1.setId( 1 ); + entity1.setIndexedField( "updatedValue" ); + + session.merge( entity1 ); + + backendMock.expectWorks( IndexedEntity.INDEX ) + .addOrUpdate( "1", b -> b + .field( "indexedField", entity1.getIndexedField() ) + .field( "shallowReindexOnUpdateField", null ) + .field( "noReindexOnUpdateField", null ) + ); + } ); + backendMock.verifyExpectationsMet(); + } + + /** + * Test that merging an entity using merge() to change a non-indexed field + * does not trigger reindexing of the indexed entity owning the property. + */ + @Test + @TestForIssue(jiraKey = "HSEARCH-3199") + public void sessionMerge_directValueUpdate_nonIndexedField() { + setupHolder.runInTransaction( session -> { + IndexedEntity entity1 = new IndexedEntity(); + entity1.setId( 1 ); + entity1.setNonIndexedField( "initialValue" ); + + session.persist( entity1 ); + + backendMock.expectWorks( IndexedEntity.INDEX ) + .add( "1", b -> b + .field( "indexedField", entity1.getIndexedField() ) + .field( "shallowReindexOnUpdateField", null ) + .field( "noReindexOnUpdateField", null ) + ); + } ); + backendMock.verifyExpectationsMet(); + + setupHolder.runInTransaction( session -> { + IndexedEntity entity1 = new IndexedEntity(); + entity1.setId( 1 ); + entity1.setNonIndexedField( "updatedValue" ); + + session.merge( entity1 ); + } ); + backendMock.verifyExpectationsMet(); + } + public Consumer expectedValue(String indexedFieldExpectedValue) { return b -> b.field( "indexedField", indexedFieldExpectedValue ) .field( "shallowReindexOnUpdateField", null ) diff --git a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/session/AutomaticIndexingSessionFlushIT.java b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/session/AutomaticIndexingSessionFlushIT.java index 7c1f5ebb7fd..51a4db454dc 100644 --- a/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/session/AutomaticIndexingSessionFlushIT.java +++ b/integrationtest/mapper/orm/src/test/java/org/hibernate/search/integrationtest/mapper/orm/automaticindexing/session/AutomaticIndexingSessionFlushIT.java @@ -85,7 +85,7 @@ public void onAutoFlush() { .add( "1", b -> b.field( "text", "number1" ) ); // An auto flush is performed on query invocation - List resultList = session.createQuery( "select i from IndexedEntity i" ) + List resultList = session.createQuery( "select i from IndexedEntity i", IndexedEntity.class ) .setHibernateFlushMode( FlushMode.AUTO ) .getResultList(); diff --git a/integrationtest/v5migrationhelper/orm/src/test/java/org/hibernate/search/test/engine/LazyCollectionsUpdatingTest.java b/integrationtest/v5migrationhelper/orm/src/test/java/org/hibernate/search/test/engine/LazyCollectionsUpdatingTest.java index 614acb97ea0..c5cc36d716b 100644 --- a/integrationtest/v5migrationhelper/orm/src/test/java/org/hibernate/search/test/engine/LazyCollectionsUpdatingTest.java +++ b/integrationtest/v5migrationhelper/orm/src/test/java/org/hibernate/search/test/engine/LazyCollectionsUpdatingTest.java @@ -23,7 +23,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; /** * TestCase for HSEARCH-178 (Search hitting HHH-2763) @@ -47,9 +46,6 @@ public void testUpdatingInTransaction() { busStop.setRoadName( "new road" ); tx.commit(); } - catch (org.hibernate.annotations.common.AssertionFailure ass) { - fail( ass.getMessage() ); - } finally { fullTextSession.close(); } @@ -68,9 +64,6 @@ public void testUpdatingOutOfTransaction() { busStop.setRoadName( "new road" ); fullTextSession.flush(); } - catch (org.hibernate.annotations.common.AssertionFailure ass) { - fail( ass.getMessage() ); - } finally { fullTextSession.close(); } diff --git a/integrationtest/v5migrationhelper/orm/src/test/resources/hibernate.properties b/integrationtest/v5migrationhelper/orm/src/test/resources/hibernate.properties deleted file mode 100644 index 73a31015ed9..00000000000 --- a/integrationtest/v5migrationhelper/orm/src/test/resources/hibernate.properties +++ /dev/null @@ -1,26 +0,0 @@ -################################################################################################ -# Hibernate Search, full-text query for your domain model # -# # -# License: GNU Lesser General Public License (LGPL), version 2.1 or later # -# See the lgpl.txt file in the root directory or . # -################################################################################################ - -# DB connection info is passed through JVM system properties in order to be able to change it dynamically. -# See the root POM for more details. - -hibernate.hbm2ddl.auto = create-drop - -# Some tests need 15 parallel open Sessions (e.g. org.hibernate.search.test.engine.worker.WorkerTestCase) -# and some ID generation strategies will require 2 connections per session. -# So use 15*2+1 connections at most. -hibernate.connection.pool_size = 31 - -hibernate.show_sql = false -hibernate.format_sql = false - -hibernate.max_fetch_depth = 5 - -hibernate.cache.region_prefix = hibernate.test -hibernate.cache.region.factory_class = org.hibernate.testing.cache.CachingRegionFactory - -hibernate.implicit_naming_strategy = component-path diff --git a/mapper/orm-batch-jsr352/core/src/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java b/mapper/orm-batch-jsr352/core/src/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java index cae1ed42685..e4b626af51c 100644 --- a/mapper/orm-batch-jsr352/core/src/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java +++ b/mapper/orm-batch-jsr352/core/src/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java @@ -308,7 +308,7 @@ private FetchingStrategy createHqlFetchingStrategy( String hql = customQueryHql; return (session, lastCheckpointInfo) -> { - Query query = session.createQuery( hql ); + Query query = session.createQuery( hql, Object.class ); if ( lastCheckpointInfo != null ) { query.setFirstResult( lastCheckpointInfo.getProcessedEntityCount() ); diff --git a/orm6/integrationtest/mapper/orm-coordination-outbox-polling/ant-src-changes.patch b/orm6/integrationtest/mapper/orm-coordination-outbox-polling/ant-src-changes.patch new file mode 100644 index 00000000000..4f213f5b19b --- /dev/null +++ b/orm6/integrationtest/mapper/orm-coordination-outbox-polling/ant-src-changes.patch @@ -0,0 +1,26 @@ +diff --git a/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingDisabledIT.java b/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingDisabledIT.java +index ef59998f6f..e43f3b38e5 100644 +--- a/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingDisabledIT.java ++++ b/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingDisabledIT.java +@@ -83,7 +83,7 @@ public List setupParams() { + + @Test + public void metamodel_onlyUserEntities() { +- assertThat( setupHolder.sessionFactory().getMetamodel().getEntities() ) ++ assertThat( setupHolder.sessionFactory().getJpaMetamodel().getEntities() ) + .extracting( EntityType::getName ) + .containsOnly( IndexedEntity.NAME ); + } +diff --git a/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingStrategyPropertyValueIT.java b/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingStrategyPropertyValueIT.java +index a3d83491fa..7bb088d657 100644 +--- a/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingStrategyPropertyValueIT.java ++++ b/test/java/org/hibernate/search/integrationtest/mapper/orm/coordination/outboxpolling/OutboxPollingStrategyPropertyValueIT.java +@@ -101,7 +101,7 @@ public void resetFilter() { + + @Test + public void metamodel_userEntitiesAndOutboxEventAndAgent() { +- assertThat( setupHolder.sessionFactory().getMetamodel().getEntities() ) ++ assertThat( setupHolder.sessionFactory().getJpaMetamodel().getEntities() ) + .>extracting( Type::getJavaType ) + .containsExactlyInAnyOrder( IndexedEntity.class, OutboxEvent.class, Agent.class ); + } diff --git a/orm6/integrationtest/mapper/orm/ant-src-changes.patch b/orm6/integrationtest/mapper/orm/ant-src-changes.patch index a56d2db44d6..040c91fb225 100644 --- a/orm6/integrationtest/mapper/orm/ant-src-changes.patch +++ b/orm6/integrationtest/mapper/orm/ant-src-changes.patch @@ -1,3 +1,45 @@ +diff --git a/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java b/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java +index 52694f380c..adbce15922 100644 +--- a/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java ++++ b/test/java/org/hibernate/search/integrationtest/mapper/orm/dynamicmap/DynamicMapBaseIT.java +@@ -124,7 +124,7 @@ public void simple() { + ); + + assertThat( query.fetchAllHits() ).containsExactly( +- (Map) session.load( entityTypeName, 1 ) ++ (Map) session.getReference( entityTypeName, 1 ) + ); + } ); + } +@@ -184,7 +184,7 @@ public void searchObject() { + ); + + assertThat( query.fetchAllHits() ).containsExactly( +- session.load( entityTypeName, 1 ) ++ session.getReference( entityTypeName, 1 ) + ); + } ); + } +@@ -303,7 +303,7 @@ public void nonEntityIdDocumentId() { + ); + + assertThat( query.fetchAllHits() ).containsExactly( +- session.load( entityTypeName, 1 ) ++ session.getReference( entityTypeName, 1 ) + ); + } ); + } +@@ -390,8 +390,8 @@ public void inheritance() { + ); + + assertThat( query.fetchAllHits() ).containsExactly( +- (Map) session.load( entityA_BTypeName, 1 ), +- (Map) session.load( entityA_CTypeName, 2 ) ++ (Map) session.getReference( entityA_BTypeName, 1 ), ++ (Map) session.getReference( entityA_CTypeName, 2 ) + ); + } ); + } diff --git a/test/java/org/hibernate/search/integrationtest/mapper/orm/hibernateormapis/ToHibernateOrmScrollableResultsIT.java b/test/java/org/hibernate/search/integrationtest/mapper/orm/hibernateormapis/ToHibernateOrmScrollableResultsIT.java index e556ccaf66..3cea4cab56 100644 --- a/test/java/org/hibernate/search/integrationtest/mapper/orm/hibernateormapis/ToHibernateOrmScrollableResultsIT.java @@ -837,7 +879,7 @@ index c032664bb9..4d205fdccf 100644 .withProperty( AvailableSettings.USE_SECOND_LEVEL_CACHE, "true" ) .withAnnotatedTypes( IndexedEntity.class ); diff --git a/test/java/org/hibernate/search/integrationtest/mapper/orm/model/BackRefPropertyIT.java b/test/java/org/hibernate/search/integrationtest/mapper/orm/model/BackRefPropertyIT.java -index 1bf135620e..a897a44202 100644 +index 1bf135620e..97da0239d0 100644 --- a/test/java/org/hibernate/search/integrationtest/mapper/orm/model/BackRefPropertyIT.java +++ b/test/java/org/hibernate/search/integrationtest/mapper/orm/model/BackRefPropertyIT.java @@ -19,7 +19,7 @@ @@ -855,7 +897,7 @@ index 1bf135620e..a897a44202 100644 // Check that there actually is a backref: - MetamodelImplementor metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getMetamodel(); - assertThat( metamodel.entityPersister( IndexedEntity.class ).getEntityMetamodel().getPropertyNames() ) -+ MappingMetamodel metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getMetamodel(); ++ MappingMetamodel metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getMappingMetamodel(); + assertThat( metamodel.getEntityDescriptor( IndexedEntity.class ).getEntityMetamodel().getPropertyNames() ) .contains( "_containing_fk_containingidBackref" ) .contains( "_containingIndexBackref" ); @@ -900,7 +942,7 @@ index d110dbb171..0796b95350 100644 @OneToMany(mappedBy = "genericProperty") diff --git a/test/java/org/hibernate/search/integrationtest/mapper/orm/model/SyntheticPropertyIT.java b/test/java/org/hibernate/search/integrationtest/mapper/orm/model/SyntheticPropertyIT.java -index fd7d546f8f..48b93ae1a0 100644 +index fd7d546f8f..42625565bc 100644 --- a/test/java/org/hibernate/search/integrationtest/mapper/orm/model/SyntheticPropertyIT.java +++ b/test/java/org/hibernate/search/integrationtest/mapper/orm/model/SyntheticPropertyIT.java @@ -19,7 +19,7 @@ @@ -918,7 +960,7 @@ index fd7d546f8f..48b93ae1a0 100644 // Check that there actually is a synthetic property: - MetamodelImplementor metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getMetamodel(); - assertThat( metamodel.entityPersister( ContainedEntity.class ).getEntityMetamodel().getPropertyNames() ) -+ MappingMetamodel metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getMetamodel(); ++ MappingMetamodel metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getMappingMetamodel(); + assertThat( metamodel.getEntityDescriptor( ContainedEntity.class ).getEntityMetamodel().getPropertyNames() ) .contains( "_" + IndexedEntity.class.getName().replace( '.', '_' ) + "_contained" ); diff --git a/orm6/mapper/orm-batch-jsr352/core/ant-src-changes.patch b/orm6/mapper/orm-batch-jsr352/core/ant-src-changes.patch index f533b371a41..841b6a73c6f 100644 --- a/orm6/mapper/orm-batch-jsr352/core/ant-src-changes.patch +++ b/orm6/mapper/orm-batch-jsr352/core/ant-src-changes.patch @@ -43,7 +43,7 @@ index c8763c2b4a..2d975eab7e 100644 } diff --git a/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java b/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java -index ed05db3af4..a30c55ae41 100644 +index 6daddd7182..47a1fe9fcd 100644 --- a/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java +++ b/main/java/org/hibernate/search/batch/jsr352/core/massindexing/step/spi/EntityReader.java @@ -400,7 +400,7 @@ else if ( lowerBound != null ) { @@ -95,7 +95,7 @@ index ed05db3af4..a30c55ae41 100644 } diff --git a/main/java/org/hibernate/search/batch/jsr352/core/massindexing/util/impl/PersistenceUtil.java b/main/java/org/hibernate/search/batch/jsr352/core/massindexing/util/impl/PersistenceUtil.java -index e7132835a4..377dc213e0 100644 +index e7132835a4..e5cdce650e 100644 --- a/main/java/org/hibernate/search/batch/jsr352/core/massindexing/util/impl/PersistenceUtil.java +++ b/main/java/org/hibernate/search/batch/jsr352/core/massindexing/util/impl/PersistenceUtil.java @@ -18,7 +18,7 @@ @@ -112,7 +112,7 @@ index e7132835a4..377dc213e0 100644 SessionFactoryImplementor sessionFactory = entityManagerFactory.unwrap( SessionFactoryImplementor.class ); List result = new ArrayList<>( types.size() ); - MetamodelImplementor metamodel = sessionFactory.getMetamodel(); -+ MappingMetamodel metamodel = sessionFactory.getMetamodel(); ++ MappingMetamodel metamodel = sessionFactory.getMappingMetamodel(); for ( Class type : types ) { result.add( createDescriptor( metamodel, type ) ); } diff --git a/orm6/mapper/orm-coordination-outbox-polling/ant-src-changes.patch b/orm6/mapper/orm-coordination-outbox-polling/ant-src-changes.patch index b60ea1df4d6..d98554e3b09 100644 --- a/orm6/mapper/orm-coordination-outbox-polling/ant-src-changes.patch +++ b/orm6/mapper/orm-coordination-outbox-polling/ant-src-changes.patch @@ -60,3 +60,51 @@ index 085409d2b8..3f497919bb 100644 return Collections.singletonList( mappingDocument ); } } +diff --git a/main/java/org/hibernate/search/mapper/orm/coordination/outboxpolling/mapping/impl/OutboxPollingSearchMappingImpl.java b/main/java/org/hibernate/search/mapper/orm/coordination/outboxpolling/mapping/impl/OutboxPollingSearchMappingImpl.java +index 9052de4cec..f8c90756e0 100644 +--- a/main/java/org/hibernate/search/mapper/orm/coordination/outboxpolling/mapping/impl/OutboxPollingSearchMappingImpl.java ++++ b/main/java/org/hibernate/search/mapper/orm/coordination/outboxpolling/mapping/impl/OutboxPollingSearchMappingImpl.java +@@ -14,6 +14,7 @@ + import org.hibernate.Session; + import org.hibernate.engine.spi.SessionFactoryImplementor; + import org.hibernate.engine.spi.SharedSessionContractImplementor; ++import org.hibernate.query.MutationQuery; + import org.hibernate.query.Query; + import org.hibernate.search.mapper.orm.common.spi.TransactionHelper; + import org.hibernate.search.mapper.orm.coordination.common.spi.CoordinationStrategyStartContext; +@@ -76,7 +77,7 @@ public int reprocessAbortedEvents() { + + try ( Session session = sessionFactory.openSession() ) { + return transactionHelper.inTransaction( (SharedSessionContractImplementor) session, null, s -> { +- Query query = session.createQuery( UPDATE_EVENTS_WITH_STATUS ); ++ MutationQuery query = session.createMutationQuery( UPDATE_EVENTS_WITH_STATUS ); + query.setParameter( "status", OutboxEvent.Status.ABORTED ); + query.setParameter( "newStatus", OutboxEvent.Status.PENDING ); + return query.executeUpdate(); +@@ -90,7 +91,7 @@ public int reprocessAbortedEvents(String tenantId) { + + try ( Session session = sessionFactory.withOptions().tenantIdentifier( tenantId ).openSession() ) { + return transactionHelper.inTransaction( (SharedSessionContractImplementor) session, null, s -> { +- Query query = session.createQuery( UPDATE_EVENTS_WITH_STATUS ); ++ MutationQuery query = session.createMutationQuery( UPDATE_EVENTS_WITH_STATUS ); + query.setParameter( "status", OutboxEvent.Status.ABORTED ); + query.setParameter( "newStatus", OutboxEvent.Status.PENDING ); + return query.executeUpdate(); +@@ -104,7 +105,7 @@ public int clearAllAbortedEvents() { + + try ( Session session = sessionFactory.openSession() ) { + return transactionHelper.inTransaction( (SharedSessionContractImplementor) session, null, s -> { +- Query query = session.createQuery( DELETE_EVENTS_WITH_STATUS ); ++ MutationQuery query = session.createMutationQuery( DELETE_EVENTS_WITH_STATUS ); + query.setParameter( "status", OutboxEvent.Status.ABORTED ); + return query.executeUpdate(); + } ); +@@ -117,7 +118,7 @@ public int clearAllAbortedEvents(String tenantId) { + + try ( Session session = sessionFactory.withOptions().tenantIdentifier( tenantId ).openSession() ) { + return transactionHelper.inTransaction( (SharedSessionContractImplementor) session, null, s -> { +- Query query = session.createQuery( DELETE_EVENTS_WITH_STATUS ); ++ MutationQuery query = session.createMutationQuery( DELETE_EVENTS_WITH_STATUS ); + query.setParameter( "status", OutboxEvent.Status.ABORTED ); + return query.executeUpdate(); + } ); diff --git a/orm6/mapper/orm/ant-src-changes.patch b/orm6/mapper/orm/ant-src-changes.patch index ab2a4ae6b1b..196f14bbe5c 100644 --- a/orm6/mapper/orm/ant-src-changes.patch +++ b/orm6/mapper/orm/ant-src-changes.patch @@ -34,7 +34,7 @@ index 289a060c28..60e392d528 100644 .build(); // Orchestrate bootstrap and shutdown diff --git a/main/java/org/hibernate/search/mapper/orm/common/impl/HibernateOrmUtils.java b/main/java/org/hibernate/search/mapper/orm/common/impl/HibernateOrmUtils.java -index d61af877f4..411a107173 100644 +index d61af877f4..116de2331f 100644 --- a/main/java/org/hibernate/search/mapper/orm/common/impl/HibernateOrmUtils.java +++ b/main/java/org/hibernate/search/mapper/orm/common/impl/HibernateOrmUtils.java @@ -21,7 +21,7 @@ @@ -51,7 +51,7 @@ index d61af877f4..411a107173 100644 * So we need to exclude non-entity types, and for that we need the Hibernate ORM metamodel. */ - MetamodelImplementor metamodel = sessionFactory.getMetamodel(); -+ MappingMetamodel metamodel = sessionFactory.getMetamodel(); ++ MappingMetamodel metamodel = sessionFactory.getMappingMetamodel(); String rootEntityName = entityType.getRootEntityName(); - return metamodel.entityPersister( rootEntityName ); + return metamodel.getEntityDescriptor( rootEntityName ); @@ -76,7 +76,7 @@ index d61af877f4..411a107173 100644 } - MetamodelImplementor metamodel = sessionFactory.getMetamodel(); -+ MappingMetamodel metamodel = sessionFactory.getMetamodel(); ++ MappingMetamodel metamodel = sessionFactory.getMappingMetamodel(); int concreteSubTypesCount = 0; for ( String subClassEntityName : subClassEntityNames ) { - if ( !metamodel.entityPersister( subClassEntityName ).getEntityMetamodel().isAbstract() ) { @@ -89,7 +89,7 @@ index d61af877f4..411a107173 100644 } - MetamodelImplementor metamodel = sessionFactory.getMetamodel(); -+ MappingMetamodel metamodel = sessionFactory.getMetamodel(); ++ MappingMetamodel metamodel = sessionFactory.getMappingMetamodel(); int concreteSubTypesCount = 0; for ( String subClassEntityName : subClassEntityNames ) { - if ( !metamodel.entityPersister( subClassEntityName ).getEntityMetamodel().isAbstract() ) { @@ -98,7 +98,7 @@ index d61af877f4..411a107173 100644 } } diff --git a/main/java/org/hibernate/search/mapper/orm/loading/impl/HibernateOrmEntityIdEntityLoadingStrategy.java b/main/java/org/hibernate/search/mapper/orm/loading/impl/HibernateOrmEntityIdEntityLoadingStrategy.java -index 21503d08be..e2121b5879 100644 +index 21503d08be..4d35daf39e 100644 --- a/main/java/org/hibernate/search/mapper/orm/loading/impl/HibernateOrmEntityIdEntityLoadingStrategy.java +++ b/main/java/org/hibernate/search/mapper/orm/loading/impl/HibernateOrmEntityIdEntityLoadingStrategy.java @@ -12,7 +12,7 @@ @@ -115,7 +115,7 @@ index 21503d08be..e2121b5879 100644 private static EntityPersister toMostSpecificCommonEntitySuperType(SessionImplementor session, Iterable> targetEntityTypeContexts) { - MetamodelImplementor metamodel = session.getSessionFactory().getMetamodel(); -+ MappingMetamodel metamodel = session.getSessionFactory().getMetamodel(); ++ MappingMetamodel metamodel = session.getSessionFactory().getMappingMetamodel(); EntityPersister result = null; for ( LoadingTypeContext targetTypeContext : targetEntityTypeContexts ) { EntityPersister type = targetTypeContext.entityPersister(); @@ -163,8 +163,22 @@ index 8220212f46..ea908f7bd3 100644 EntityKey entityKey = sessionContext.session().generateEntityKey( id, entityPersister ); entityKeys[i] = ( entityKey ); } +diff --git a/main/java/org/hibernate/search/mapper/orm/loading/impl/MutableEntityLoadingOptions.java b/main/java/org/hibernate/search/mapper/orm/loading/impl/MutableEntityLoadingOptions.java +index a8669bf79d..776c86fc0e 100644 +--- a/main/java/org/hibernate/search/mapper/orm/loading/impl/MutableEntityLoadingOptions.java ++++ b/main/java/org/hibernate/search/mapper/orm/loading/impl/MutableEntityLoadingOptions.java +@@ -50,6 +50,9 @@ public void entityGraphHint(EntityGraphHint entityGraphHint, boolean replaceE + else if ( replaceExisting ) { + entityGraphHints.clear(); + } ++ if ( entityGraphHint == null ) { ++ return; ++ } + this.entityGraphHints.add( entityGraphHint ); + } + } diff --git a/main/java/org/hibernate/search/mapper/orm/loading/impl/TypeQueryFactory.java b/main/java/org/hibernate/search/mapper/orm/loading/impl/TypeQueryFactory.java -index 82c86985ab..c324497a01 100644 +index 82c86985ab..3abdf72591 100644 --- a/main/java/org/hibernate/search/mapper/orm/loading/impl/TypeQueryFactory.java +++ b/main/java/org/hibernate/search/mapper/orm/loading/impl/TypeQueryFactory.java @@ -6,6 +6,7 @@ @@ -189,7 +203,7 @@ index 82c86985ab..c324497a01 100644 static TypeQueryFactory create(SessionFactoryImplementor sessionFactory, EntityPersister entityPersister, String uniquePropertyName) { - MetamodelImplementor metamodel = sessionFactory.getMetamodel(); -+ JpaMetamodel metamodel = sessionFactory.getMetamodel(); ++ JpaMetamodel metamodel = sessionFactory.getJpaMetamodel(); EntityDomainType typeOrNull = metamodel.entity( entityPersister.getEntityName() ); - if ( typeOrNull != null ) { + if ( typeOrNull != null && !( entityPersister.getMappedClass().equals( Map.class ) ) ) { @@ -211,7 +225,7 @@ index e794e21dc6..d36abb098d 100644 + } diff --git a/main/java/org/hibernate/search/mapper/orm/mapping/impl/AbstractHibernateOrmTypeContext.java b/main/java/org/hibernate/search/mapper/orm/mapping/impl/AbstractHibernateOrmTypeContext.java -index 17e33f2c15..e3b66578d9 100644 +index 17e33f2c15..565a56d897 100644 --- a/main/java/org/hibernate/search/mapper/orm/mapping/impl/AbstractHibernateOrmTypeContext.java +++ b/main/java/org/hibernate/search/mapper/orm/mapping/impl/AbstractHibernateOrmTypeContext.java @@ -10,7 +10,7 @@ @@ -229,11 +243,37 @@ index 17e33f2c15..e3b66578d9 100644 this.jpaEntityName = builder.jpaEntityName; - MetamodelImplementor metamodel = sessionFactory.getMetamodel(); - this.entityPersister = metamodel.entityPersister( builder.hibernateOrmEntityName ); -+ MappingMetamodel metamodel = sessionFactory.getMetamodel(); ++ MappingMetamodel metamodel = sessionFactory.getMappingMetamodel(); + this.entityPersister = metamodel.getEntityDescriptor( builder.hibernateOrmEntityName ); this.identifierMapping = builder.identifierMapping; this.ascendingSuperTypes = builder.ascendingSuperTypes; if ( builder.documentIdSourcePropertyName != null ) { +diff --git a/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingConfigurationContributor.java b/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingConfigurationContributor.java +index 0318ea858d..b2bf030782 100644 +--- a/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingConfigurationContributor.java ++++ b/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingConfigurationContributor.java +@@ -59,9 +59,8 @@ public void configure(MappingBuildContext buildContext, PojoMappingConfiguration + } + + // Sort the properties before processing for deterministic iteration +- @SuppressWarnings("unchecked") // Hibernate ORM gives us raw types, we must make do. + List properties = +- HibernateOrmUtils.sortedNonSyntheticProperties( persistentClass.getPropertyIterator() ); ++ HibernateOrmUtils.sortedNonSyntheticProperties( persistentClass.getProperties().iterator() ); + + Property identifierProperty = persistentClass.getIdentifierProperty(); + Optional identifierPropertyNameOptional = +@@ -121,9 +120,8 @@ private void contributeEmbeddableTypeMetadata( + */ + if ( processedEmbeddableTypes.add( componentTypeModel ) ) { + // Sort the properties before processing for deterministic iteration +- @SuppressWarnings("unchecked") // Hibernate ORM gives us raw types, we must make do. + List properties = +- HibernateOrmUtils.sortedNonSyntheticProperties( componentValue.getPropertyIterator() ); ++ HibernateOrmUtils.sortedNonSyntheticProperties( componentValue.getProperties().iterator() ); + configurationCollector.collectContributor( componentTypeModel, + new ErrorCollectingPojoTypeMetadataContributor() + // Ensure Hibernate ORM metadata about properties is translated into Hibernate Search metadata diff --git a/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingInitiator.java b/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingInitiator.java index de45790392..99b67466db 100644 --- a/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingInitiator.java @@ -302,10 +342,10 @@ index de45790392..99b67466db 100644 this.preIntegrationService = preIntegrationService; } diff --git a/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingPropertiesMetadataContributor.java b/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingPropertiesMetadataContributor.java -index c4fd693171..b8b6e6bd10 100644 +index c4fd693171..c2f2d35e35 100644 --- a/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingPropertiesMetadataContributor.java +++ b/main/java/org/hibernate/search/mapper/orm/mapping/impl/HibernateOrmMappingPropertiesMetadataContributor.java -@@ -10,6 +10,9 @@ +@@ -10,12 +10,14 @@ import java.util.List; import java.util.StringTokenizer; @@ -315,7 +355,13 @@ index c4fd693171..b8b6e6bd10 100644 import org.hibernate.mapping.Column; import org.hibernate.mapping.Component; import org.hibernate.mapping.OneToMany; -@@ -100,13 +103,22 @@ else if ( value instanceof SimpleValue ) { + import org.hibernate.mapping.OneToOne; + import org.hibernate.mapping.Property; +-import org.hibernate.mapping.Selectable; + import org.hibernate.mapping.SimpleValue; + import org.hibernate.mapping.ToOne; + import org.hibernate.mapping.Value; +@@ -100,13 +102,18 @@ else if ( value instanceof SimpleValue ) { } private void collectScale(PojoAdditionalMetadataCollectorPropertyNode collector, Value value) { @@ -325,30 +371,26 @@ index c4fd693171..b8b6e6bd10 100644 - if ( selectable instanceof Column ) { - int scale = ( (Column) selectable ).getScale(); - collector.value( getExtractorPath( value ) ).decimalScale( scale ); -+ Iterator columnIterator = value.getColumnIterator(); ++ Iterator columnIterator = value.getColumns().iterator(); + Dialect dialect = basicTypeMetadataProvider.getDialect(); + Metadata metadata = basicTypeMetadataProvider.getMetadata(); + + while ( columnIterator.hasNext() ) { -+ Selectable mappedColumn = columnIterator.next(); -+ if ( !(mappedColumn instanceof Column) ) { -+ continue; - } -+ Column column = (Column) mappedColumn; ++ Column column = columnIterator.next(); + Size size = column.getColumnSize( dialect, metadata ); + Integer scale = size.getScale(); + if ( scale == null ) { + continue; -+ } + } + collector.value( getExtractorPath( value ) ).decimalScale( scale ); } } diff --git a/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmBasicTypeMetadataProvider.java b/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmBasicTypeMetadataProvider.java -index 14dfc36c0f..fbbcf29649 100644 +index 14dfc36c0f..e73416a06f 100644 --- a/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmBasicTypeMetadataProvider.java +++ b/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmBasicTypeMetadataProvider.java -@@ -16,6 +16,7 @@ +@@ -16,13 +16,14 @@ import org.hibernate.MappingException; import org.hibernate.boot.Metadata; @@ -356,6 +398,14 @@ index 14dfc36c0f..fbbcf29649 100644 import org.hibernate.mapping.Component; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; + import org.hibernate.mapping.Value; + import org.hibernate.property.access.spi.Getter; + +-@SuppressWarnings( "unchecked" ) // Hibernate ORM gives us raw types, we must make do. ++@SuppressWarnings( "unchecked" ) // Hibernate Commons annotations gives us wildcard types, we must make do. + public class HibernateOrmBasicTypeMetadataProvider { + + public static HibernateOrmBasicTypeMetadataProvider create(Metadata metadata) { @@ -34,7 +35,7 @@ public static HibernateOrmBasicTypeMetadataProvider create(Metadata metadata) { new TreeSet<>( Comparator.comparing( PersistentClass::getEntityName ) ); persistentClasses.addAll( metadata.getEntityBindings() ); @@ -365,7 +415,60 @@ index 14dfc36c0f..fbbcf29649 100644 for ( PersistentClass persistentClass : persistentClasses ) { collectPersistentClass( builder, persistentClass ); -@@ -221,6 +222,8 @@ private static HibernateOrmGenericTypeModelFactory collectEmbedded(Builder me +@@ -55,7 +56,7 @@ private static void collectPersistentClass(Builder metadataProviderBuilder, Pers + + collectClassType( + metadataProviderBuilder, javaClass, +- persistentClass.getIdentifierProperty(), persistentClass.getPropertyIterator() ++ persistentClass.getIdentifierProperty(), persistentClass.getProperties().iterator() + ); + + metadataProviderBuilder.typeIdentifierResolverBuilder.addClassEntityType( +@@ -66,7 +67,7 @@ private static void collectPersistentClass(Builder metadataProviderBuilder, Pers + collectDynamicMapType( + metadataProviderBuilder, hibernateOrmEntityName, + persistentClass.getSuperclass(), +- persistentClass.getIdentifierProperty(), persistentClass.getPropertyIterator() ++ persistentClass.getIdentifierProperty(), persistentClass.getProperties().iterator() + ); + + metadataProviderBuilder.typeIdentifierResolverBuilder.addDynamicMapEntityType( +@@ -160,7 +161,7 @@ else if ( value instanceof org.hibernate.mapping.Array ) { + else if ( value instanceof org.hibernate.mapping.Map ) { + org.hibernate.mapping.Map map = (org.hibernate.mapping.Map) value; + return HibernateOrmGenericTypeModelFactory.map( +- map.getCollectionType().getReturnedClass(), ++ (Class>) map.getCollectionType().getReturnedClass(), + /* + * Do not let ORM confuse you: getKey() doesn't return the value of the map key, + * but the value of the foreign key to the targeted entity... +@@ -173,7 +174,7 @@ else if ( value instanceof org.hibernate.mapping.Map ) { + else if ( value instanceof org.hibernate.mapping.Collection ) { + org.hibernate.mapping.Collection collection = (org.hibernate.mapping.Collection) value; + return HibernateOrmGenericTypeModelFactory.collection( +- collection.getCollectionType().getReturnedClass(), ++ (Class>) collection.getCollectionType().getReturnedClass(), + collectValue( metadataProviderBuilder, collection.getElement() ) + ); + } +@@ -203,7 +204,7 @@ private static HibernateOrmGenericTypeModelFactory collectEmbedded(Builder me + collectDynamicMapType( + metadataProviderBuilder, name, + null, /* No supertype */ +- null /* No ID */, component.getPropertyIterator() ++ null /* No ID */, component.getProperties().iterator() + ); + } + return HibernateOrmGenericTypeModelFactory.dynamicMap( name ); +@@ -214,13 +215,15 @@ private static HibernateOrmGenericTypeModelFactory collectEmbedded(Builder me + if ( !metadataProviderBuilder.classTypeMetadata.containsKey( javaClass ) ) { + collectClassType( + metadataProviderBuilder, javaClass, +- null /* No ID */, component.getPropertyIterator() ++ null /* No ID */, component.getProperties().iterator() + ); + } + return HibernateOrmGenericTypeModelFactory.rawType( javaClass ); } } @@ -418,7 +521,7 @@ index 14dfc36c0f..fbbcf29649 100644 return new HibernateOrmBasicTypeMetadataProvider( this ); } diff --git a/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmPathsDefinition.java b/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmPathsDefinition.java -index 355980c45a..30e334a6a0 100644 +index 355980c45a..6489423a9c 100644 --- a/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmPathsDefinition.java +++ b/main/java/org/hibernate/search/mapper/orm/model/impl/HibernateOrmPathsDefinition.java @@ -16,6 +16,7 @@ @@ -429,7 +532,20 @@ index 355980c45a..30e334a6a0 100644 import org.hibernate.mapping.Component; import org.hibernate.mapping.OneToMany; import org.hibernate.mapping.PersistentClass; -@@ -252,7 +253,7 @@ private Optional resolveValueNode(Set pathsAsStrings, PojoModelPa +@@ -166,11 +167,9 @@ public HibernateOrmPathsDefinition(PersistentClass persistentClass) { + } + + @Override +- @SuppressWarnings("unchecked") + public List preDefinedOrdinals() { + List preDefinedOrdinals = new ArrayList<>(); +- for ( Iterator iterator = persistentClass.getPropertyClosureIterator(); iterator.hasNext(); ) { +- Property property = iterator.next(); ++ for ( Property property : persistentClass.getPropertyClosure() ) { + preDefinedOrdinals.add( property.getName() ); + } + return preDefinedOrdinals; +@@ -252,7 +251,7 @@ private Optional resolveValueNode(Set pathsAsStrings, PojoModelPa return Optional.of( baseValue ); } } @@ -438,7 +554,7 @@ index 355980c45a..30e334a6a0 100644 pathsAsStrings.add( propertyNode.toPropertyString() ); // The string representation of the path was added, we can stop here return Optional.empty(); -@@ -309,7 +310,7 @@ private Optional resolveExtractorPath(Set pathsAsStrings, PojoMod +@@ -309,7 +308,7 @@ private Optional resolveExtractorPath(Set pathsAsStrings, PojoMod if ( !extractorNameIterator.hasNext() ) { // We managed to resolve the whole container value extractor list Class containedValueClass = containedValue.getClass(); @@ -448,7 +564,7 @@ index 355980c45a..30e334a6a0 100644 || isWholePath && isAssociation( containedValueClass ) ) { pathsAsStrings.add( propertyNode.toPropertyString() ); diff --git a/main/java/org/hibernate/search/mapper/orm/search/query/impl/HibernateOrmSearchQueryAdapter.java b/main/java/org/hibernate/search/mapper/orm/search/query/impl/HibernateOrmSearchQueryAdapter.java -index c8ca89a1e0..7203e7d6e8 100644 +index c8ca89a1e0..b6a7fb955e 100644 --- a/main/java/org/hibernate/search/mapper/orm/search/query/impl/HibernateOrmSearchQueryAdapter.java +++ b/main/java/org/hibernate/search/mapper/orm/search/query/impl/HibernateOrmSearchQueryAdapter.java @@ -7,52 +7,48 @@ @@ -653,7 +769,7 @@ index c8ca89a1e0..7203e7d6e8 100644 case HibernateOrmSearchQueryHints.JAVAX_LOADGRAPH: case HibernateOrmSearchQueryHints.JAKARTA_LOADGRAPH: - applyGraph( hintValueToEntityGraph( value ), GraphSemantic.LOAD ); -+ applyEntityGraphQueryHint( hintName, hintValueToEntityGraph( value ) ); ++ applyEntityGraphHint( hintName, value ); break; default: - handleUnrecognizedHint( hintName, value ); @@ -661,24 +777,27 @@ index c8ca89a1e0..7203e7d6e8 100644 break; } return this; -@@ -207,141 +150,98 @@ public HibernateOrmSearchQueryAdapter applyGraph(RootGraph graph, GraphSemant +@@ -200,148 +143,104 @@ public HibernateOrmSearchQueryAdapter setTimeout(int timeout) { + } + + @Override +- @SuppressWarnings({ "unchecked", "rawtypes" }) ++ @SuppressWarnings("rawtypes") + public HibernateOrmSearchQueryAdapter applyGraph(RootGraph graph, GraphSemantic semantic) { +- loadingOptions.entityGraphHint( new EntityGraphHint<>( graph, semantic ), true ); ++ applyGraph( (RootGraphImplementor) graph, semantic ); + return this; } @Override - public ScrollableResultsImplementor scroll() { -+ protected void applyEntityGraphQueryHint(String hintName, RootGraphImplementor entityGraph) { -+ GraphSemantic graphSemantic = GraphSemantic.fromJpaHintName( hintName ); -+ this.applyGraph( entityGraph, graphSemantic ); -+ } -+ -+ @Override + public ScrollableResultsImplementor scroll() { return scroll( ScrollMode.FORWARD_ONLY ); } @Override - public ScrollableResultsImplementor scroll(ScrollMode scrollMode) { -+ public ScrollableResultsImplementor scroll(ScrollMode scrollMode) { ++ protected ScrollableResultsImplementor doScroll(ScrollMode scrollMode) { if ( !ScrollMode.FORWARD_ONLY.equals( scrollMode ) ) { throw log.canOnlyUseScrollWithScrollModeForwardsOnly( scrollMode ); } @@ -708,8 +827,8 @@ index c8ca89a1e0..7203e7d6e8 100644 + } + + @Override -+ protected void beforeQuery(boolean requiresTxn) { -+ super.beforeQuery( requiresTxn ); ++ protected void beforeQuery() { ++ super.beforeQuery(); + + extractQueryOptions(); + } @@ -723,6 +842,11 @@ index c8ca89a1e0..7203e7d6e8 100644 + if ( queryTimeout != null ) { + delegate.failAfter( queryTimeout, TimeUnit.SECONDS ); + } ++ EntityGraphHint entityGraphHint = null; ++ if ( queryOptions.getGraph() != null ) { ++ entityGraphHint = new EntityGraphHint<>( queryOptions.getGraph(), queryOptions.getSemantic() ); ++ } ++ loadingOptions.entityGraphHint( entityGraphHint, true ); } //------------------------------------------------------------- @@ -751,15 +875,29 @@ index c8ca89a1e0..7203e7d6e8 100644 @Override - public HibernateOrmSearchQueryAdapter setParameter(Parameter calendarParameter, Calendar calendar, TemporalType temporalType) { -- throw parametersNoSupported(); -- } -- -- @Override ++ public QueryParameterBindings getParameterBindings() { ++ // parameters not supported in Hibernate Search queries ++ return QueryParameterBindings.NO_PARAM_BINDINGS; ++ } ++ ++ @Override ++ public QueryParameterBindings getQueryParameterBindings() { ++ // parameters not supported in Hibernate Search queries ++ return QueryParameterBindings.NO_PARAM_BINDINGS; ++ } ++ ++ @Override ++ public HibernateOrmSearchQueryAdapter setParameterList(String name, Object[] values) { + throw parametersNoSupported(); + } + + @Override - public HibernateOrmSearchQueryAdapter setParameter(Parameter dateParameter, Date date, TemporalType temporalType) { -- throw parametersNoSupported(); -- } -- -- @Override ++ public QueryImplementor setParameterList(String s, Collection collection, Class aClass) { + throw parametersNoSupported(); + } + + @Override - public HibernateOrmSearchQueryAdapter setParameter(String name, Object value) { - throw parametersNoSupported(); - } @@ -787,29 +925,19 @@ index c8ca89a1e0..7203e7d6e8 100644 - @Override - public Set> getParameters() { - return Collections.emptySet(); -+ public QueryParameterBindings getParameterBindings() { -+ // parameters not supported in Hibernate Search queries -+ return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - protected QueryParameterBindings getQueryParameterBindings() { -+ // parameters not supported in Hibernate Search queries -+ return QueryParameterBindings.NO_PARAM_BINDINGS; -+ } -+ -+ @Override -+ public HibernateOrmSearchQueryAdapter setParameterList(String name, Object[] values) { - throw parametersNoSupported(); - } - - @Override +- } +- +- @Override +- protected QueryParameterBindings getQueryParameterBindings() { +- throw parametersNoSupported(); +- } +- +- @Override - public HibernateOrmSearchQueryAdapter setParameter(int position, Calendar value, TemporalType temporalType) { -+ public QueryImplementor setParameterList(String s, Collection collection, Class aClass) { - throw parametersNoSupported(); - } - - @Override +- throw parametersNoSupported(); +- } +- +- @Override - public QueryParameter getParameter(String name) { - throw parametersNoSupported(); - } @@ -850,7 +978,7 @@ index c8ca89a1e0..7203e7d6e8 100644 throw parametersNoSupported(); } -@@ -350,18 +250,16 @@ private UnsupportedOperationException parametersNoSupported() { +@@ -350,18 +249,16 @@ private UnsupportedOperationException parametersNoSupported() { } @Override @@ -874,7 +1002,7 @@ index c8ca89a1e0..7203e7d6e8 100644 return new UnsupportedOperationException( "Result transformers are not supported in Hibernate Search queries" ); } -@@ -391,7 +289,12 @@ private UnsupportedOperationException lockOptionsNotSupported() { +@@ -391,7 +288,12 @@ private UnsupportedOperationException lockOptionsNotSupported() { } @Override @@ -888,7 +1016,7 @@ index c8ca89a1e0..7203e7d6e8 100644 throw new UnsupportedOperationException( "executeUpdate is not supported in Hibernate Search queries" ); } -@@ -400,30 +303,6 @@ public HibernateOrmSearchQueryAdapter setLockMode(String alias, LockMode lock +@@ -400,30 +302,6 @@ public HibernateOrmSearchQueryAdapter setLockMode(String alias, LockMode lock throw lockOptionsNotSupported(); } @@ -919,16 +1047,14 @@ index c8ca89a1e0..7203e7d6e8 100644 private static long hintValueToLong(Object value) { if ( value instanceof Number ) { return ( (Number) value ).longValue(); -@@ -442,8 +321,8 @@ private static int hintValueToInteger(Object value) { +@@ -442,8 +320,4 @@ private static int hintValueToInteger(Object value) { } } - private static RootGraph hintValueToEntityGraph(Object value) { - return (RootGraph) value; -+ private static RootGraphImplementor hintValueToEntityGraph(Object value) { -+ return (RootGraphImplementor) value; - } - +- } +- } diff --git a/main/java/org/hibernate/search/mapper/orm/search/query/spi/HibernateOrmSearchScrollableResultsAdapter.java b/main/java/org/hibernate/search/mapper/orm/search/query/spi/HibernateOrmSearchScrollableResultsAdapter.java index 069f97d042..5774325d80 100644 diff --git a/orm6/util/internal/integrationtest/mapper/orm/ant-src-changes.patch b/orm6/util/internal/integrationtest/mapper/orm/ant-src-changes.patch index cb10f9c3f06..a5cdde8a8eb 100644 --- a/orm6/util/internal/integrationtest/mapper/orm/ant-src-changes.patch +++ b/orm6/util/internal/integrationtest/mapper/orm/ant-src-changes.patch @@ -1,3 +1,51 @@ +diff --git a/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java b/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java +index 8f695c5d5b..d9dd641830 100644 +--- a/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java ++++ b/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java +@@ -429,7 +429,7 @@ private void clearDatabase(SessionFactoryImplementor sessionFactory, HibernateOr + for ( Class entityClass : config.entityClearOrder ) { + EntityType entityType; + try { +- entityType = sessionFactory.getMetamodel().entity( entityClass ); ++ entityType = sessionFactory.getJpaMetamodel().entity( entityClass ); + } + catch (IllegalArgumentException e) { + // When using annotatedTypes to infer the clear order, +@@ -446,7 +446,7 @@ private void clearDatabase(SessionFactoryImplementor sessionFactory, HibernateOr + // we try to delete all remaining entity types. + // Note we're stabilizing the order, because ORM uses a HashSet internally + // and the order may change from one execution to the next. +- List> sortedEntityTypes = sessionFactory.getMetamodel().getEntities().stream() ++ List> sortedEntityTypes = sessionFactory.getJpaMetamodel().getEntities().stream() + .sorted( Comparator.comparing( EntityType::getName ) ) + .collect( Collectors.toList() ); + for ( EntityType entityType : sortedEntityTypes ) { +@@ -531,6 +531,7 @@ private static Query createSelectOrDeleteAllOfSpecificTypeQuery(EntityType + builder.append( " where type( e ) in (:type)" ); + typeArg = entityType.getJavaType(); + } ++ @SuppressWarnings("deprecation") + Query query = QueryType.SELECT.equals( queryType ) + ? session.createQuery( builder.toString(), entityType.getJavaType() ) + : session.createQuery( builder.toString() ); +@@ -541,7 +542,7 @@ private static Query createSelectOrDeleteAllOfSpecificTypeQuery(EntityType + } + + private static boolean hasEntitySubclass(SessionFactory sessionFactory, EntityType parentEntity) { +- Metamodel metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getMetamodel(); ++ Metamodel metamodel = sessionFactory.unwrap( SessionFactoryImplementor.class ).getJpaMetamodel(); + for ( EntityType entity : metamodel.getEntities() ) { + if ( parentEntity.equals( entity.getSupertype() ) ) { + return true; +@@ -563,7 +564,7 @@ private static boolean hasPotentiallyJoinTable(SessionFactoryImplementor session + case ELEMENT_COLLECTION: + return true; + case EMBEDDED: +- EmbeddableType embeddable = sessionFactory.getMetamodel().embeddable( attribute.getJavaType() ); ++ EmbeddableType embeddable = sessionFactory.getJpaMetamodel().embeddable( attribute.getJavaType() ); + if ( hasPotentiallyJoinTable( sessionFactory, embeddable ) ) { + return true; + } diff --git a/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/multitenancy/impl/MultitenancyTestHelper.java b/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/multitenancy/impl/MultitenancyTestHelper.java index cc6c240317..a536100782 100644 --- a/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/multitenancy/impl/MultitenancyTestHelper.java @@ -19,7 +67,7 @@ index cc6c240317..a536100782 100644 new H2LazyMultiTenantConnectionProvider( tenantIds ) ); // any required backend-multi-tenancy property (e.g.:*.backend.multi_tenancy.strategy = discriminator) diff --git a/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/multitenancy/impl/MultitenancyTestHelperSchemaManagementTool.java b/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/multitenancy/impl/MultitenancyTestHelperSchemaManagementTool.java -index d5366722a2..03a984c4e7 100644 +index d5366722a2..47e9991392 100644 --- a/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/multitenancy/impl/MultitenancyTestHelperSchemaManagementTool.java +++ b/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/multitenancy/impl/MultitenancyTestHelperSchemaManagementTool.java @@ -21,6 +21,7 @@ @@ -30,7 +78,23 @@ index d5366722a2..03a984c4e7 100644 import org.hibernate.tool.schema.spi.DelayedDropAction; import org.hibernate.tool.schema.spi.ExecutionOptions; import org.hibernate.tool.schema.spi.ExtractionTool; -@@ -93,7 +94,8 @@ public SchemaCreator getSchemaCreator(Map options) { +@@ -51,8 +52,7 @@ public Class getServiceInitiated() { + } + + @Override +- @SuppressWarnings("rawtypes") // Can't do better: Map is raw in the superclass +- public SchemaManagementTool initiateService(Map configurationValues, ServiceRegistryImplementor registry) { ++ public SchemaManagementTool initiateService(Map configurationValues, ServiceRegistryImplementor registry) { + return new MultitenancyTestHelperSchemaManagementTool( tenantIds ); + } + } +@@ -88,12 +88,12 @@ private GenerationTargetToDatabase[] createSchemaTargets(ServiceRegistryImplemen + } + + @Override +- @SuppressWarnings("rawtypes") // Can't do better: Map is raw in the superclass +- public SchemaCreator getSchemaCreator(Map options) { ++ public SchemaCreator getSchemaCreator(Map options) { return new SchemaCreator() { final SchemaCreatorImpl delegate = (SchemaCreatorImpl) toolDelegate.getSchemaCreator( options ); @Override @@ -40,7 +104,13 @@ index d5366722a2..03a984c4e7 100644 TargetDescriptor targetDescriptor) { delegate.doCreation( metadata, true, generationTargets ); } -@@ -106,14 +108,15 @@ public SchemaDropper getSchemaDropper(Map options) { +@@ -101,19 +101,19 @@ public void doCreation(Metadata metadata, ExecutionOptions options, SourceDescri + } + + @Override +- @SuppressWarnings("rawtypes") // Can't do better: Map is raw in the superclass +- public SchemaDropper getSchemaDropper(Map options) { ++ public SchemaDropper getSchemaDropper(Map options) { return new SchemaDropper() { final SchemaDropperImpl delegate = (SchemaDropperImpl) toolDelegate.getSchemaDropper( options ); @Override @@ -59,3 +129,35 @@ index d5366722a2..03a984c4e7 100644 return new DelayedDropAction() { @Override public void perform(ServiceRegistry serviceRegistry) { +@@ -125,14 +125,12 @@ public void perform(ServiceRegistry serviceRegistry) { + } + + @Override +- @SuppressWarnings("rawtypes") // Can't do better: Map is raw in the superclass +- public SchemaMigrator getSchemaMigrator(Map options) { ++ public SchemaMigrator getSchemaMigrator(Map options) { + throw notSupported(); + } + + @Override +- @SuppressWarnings("rawtypes") // Can't do better: Map is raw in the superclass +- public SchemaValidator getSchemaValidator(Map options) { ++ public SchemaValidator getSchemaValidator(Map options) { + throw notSupported(); + } + +diff --git a/main/resources/hibernate.properties b/main/resources/hibernate.properties +index d866f45e6d..e5542dbbc1 100644 +--- a/main/resources/hibernate.properties ++++ b/main/resources/hibernate.properties +@@ -25,3 +25,10 @@ hibernate.cache.region.factory_class = org.hibernate.testing.cache.CachingRegion + + hibernate.implicit_naming_strategy = component-path + ++# Temporary workaround for: ++# - https://hibernate.atlassian.net/browse/HHH-15054 ++# (affects org/hibernate/search/test/proxy/ProxyTest) ++# - https://hibernate.atlassian.net/browse/HHH-15058 ++# (affects tests in org/hibernate/search/integrationtest/mapper/orm/automaticindexing/association/bytype/manytomany, ++# in particular) ++hibernate.mapping.default_list_semantics=bag diff --git a/orm6/v5migrationhelper/orm/ant-src-changes.patch b/orm6/v5migrationhelper/orm/ant-src-changes.patch index 0ac8e85a5fe..23b479c0691 100644 --- a/orm6/v5migrationhelper/orm/ant-src-changes.patch +++ b/orm6/v5migrationhelper/orm/ant-src-changes.patch @@ -1,8 +1,107 @@ +diff --git a/main/java/org/hibernate/search/FullTextSharedSessionBuilder.java b/main/java/org/hibernate/search/FullTextSharedSessionBuilder.java +index 8d32aa9852..a505240580 100644 +--- a/main/java/org/hibernate/search/FullTextSharedSessionBuilder.java ++++ b/main/java/org/hibernate/search/FullTextSharedSessionBuilder.java +@@ -10,7 +10,6 @@ + + import jakarta.persistence.EntityManager; + +-import org.hibernate.ConnectionReleaseMode; + import org.hibernate.Interceptor; + import org.hibernate.Session; + import org.hibernate.SharedSessionBuilder; +@@ -40,10 +39,6 @@ public interface FullTextSharedSessionBuilder extends SharedSessionBuilder { + @Override + FullTextSharedSessionBuilder autoClose(); + +- @Deprecated +- @Override +- FullTextSharedSessionBuilder flushBeforeCompletion(); +- + @Deprecated + @Override + FullTextSharedSessionBuilder transactionContext(); +@@ -57,10 +52,6 @@ public interface FullTextSharedSessionBuilder extends SharedSessionBuilder { + @Override + FullTextSharedSessionBuilder connection(Connection connection); + +- @Deprecated +- @Override +- FullTextSharedSessionBuilder connectionReleaseMode(ConnectionReleaseMode connectionReleaseMode); +- + @Override + FullTextSharedSessionBuilder autoJoinTransactions(boolean autoJoinTransactions); + +@@ -68,10 +59,6 @@ public interface FullTextSharedSessionBuilder extends SharedSessionBuilder { + @Override + FullTextSharedSessionBuilder autoClose(boolean autoClose); + +- @Deprecated +- @Override +- FullTextSharedSessionBuilder flushBeforeCompletion(boolean flushBeforeCompletion); +- + @Override + FullTextSession openSession(); + +diff --git a/main/java/org/hibernate/search/impl/FullTextSharedSessionBuilderDelegator.java b/main/java/org/hibernate/search/impl/FullTextSharedSessionBuilderDelegator.java +index 9f6bfae665..741c9c5898 100644 +--- a/main/java/org/hibernate/search/impl/FullTextSharedSessionBuilderDelegator.java ++++ b/main/java/org/hibernate/search/impl/FullTextSharedSessionBuilderDelegator.java +@@ -9,7 +9,6 @@ + import java.sql.Connection; + import java.util.TimeZone; + +-import org.hibernate.ConnectionReleaseMode; + import org.hibernate.FlushMode; + import org.hibernate.Interceptor; + import org.hibernate.SessionBuilder; +@@ -63,13 +62,6 @@ public FullTextSharedSessionBuilder autoClose() { + return this; + } + +- @Deprecated +- @Override +- public FullTextSharedSessionBuilder flushBeforeCompletion() { +- builder.flushBeforeCompletion(); +- return this; +- } +- + @Deprecated + @Override + public FullTextSharedSessionBuilder transactionContext() { +@@ -95,13 +87,6 @@ public FullTextSharedSessionBuilder connection(Connection connection) { + return this; + } + +- @Deprecated +- @Override +- public FullTextSharedSessionBuilder connectionReleaseMode(ConnectionReleaseMode connectionReleaseMode) { +- builder.connectionReleaseMode( connectionReleaseMode ); +- return this; +- } +- + @Override + public FullTextSharedSessionBuilder autoJoinTransactions(boolean autoJoinTransactions) { + builder.autoJoinTransactions( autoJoinTransactions ); +@@ -115,13 +100,6 @@ public FullTextSharedSessionBuilder autoClose(boolean autoClose) { + return this; + } + +- @Deprecated +- @Override +- public FullTextSharedSessionBuilder flushBeforeCompletion(boolean flushBeforeCompletion) { +- builder.flushBeforeCompletion( flushBeforeCompletion ); +- return this; +- } +- + @Override + public FullTextSession openSession() { + return Search.getFullTextSession( builder.openSession() ); diff --git a/main/java/org/hibernate/search/query/hibernate/impl/FullTextQueryImpl.java b/main/java/org/hibernate/search/query/hibernate/impl/FullTextQueryImpl.java -index c6481cc62e..8e34239ef1 100644 +index c6481cc62e..f46722f7b2 100644 --- a/main/java/org/hibernate/search/query/hibernate/impl/FullTextQueryImpl.java +++ b/main/java/org/hibernate/search/query/hibernate/impl/FullTextQueryImpl.java -@@ -7,21 +7,17 @@ +@@ -7,21 +7,13 @@ package org.hibernate.search.query.hibernate.impl; import java.util.ArrayList; @@ -17,17 +116,16 @@ index c6481cc62e..8e34239ef1 100644 -import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; -+import java.util.function.Function; - import jakarta.persistence.FlushModeType; - import jakarta.persistence.LockModeType; +-import jakarta.persistence.FlushModeType; +-import jakarta.persistence.LockModeType; -import jakarta.persistence.Parameter; -+import jakarta.persistence.PersistenceException; - import jakarta.persistence.QueryTimeoutException; +-import jakarta.persistence.QueryTimeoutException; -import jakarta.persistence.TemporalType; ++import java.util.function.Function; import org.hibernate.HibernateException; import org.hibernate.LockMode; -@@ -29,12 +25,14 @@ +@@ -29,12 +21,14 @@ import org.hibernate.ScrollMode; import org.hibernate.TypeMismatchException; import org.hibernate.engine.spi.SessionImplementor; @@ -46,7 +144,7 @@ index c6481cc62e..8e34239ef1 100644 import org.hibernate.query.spi.QueryImplementor; import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.query.spi.ScrollableResultsImplementor; -@@ -45,7 +43,6 @@ +@@ -45,7 +39,6 @@ import org.hibernate.search.mapper.orm.search.loading.dsl.SearchLoadingOptionsStep; import org.hibernate.search.mapper.orm.search.query.spi.HibernateOrmSearchQueryHints; import org.hibernate.search.mapper.orm.search.query.spi.HibernateOrmSearchScrollableResultsAdapter; @@ -54,14 +152,19 @@ index c6481cc62e..8e34239ef1 100644 import org.hibernate.search.query.DatabaseRetrievalMethod; import org.hibernate.search.query.ObjectLookupMethod; import org.hibernate.search.query.engine.spi.FacetManager; -@@ -55,7 +52,6 @@ +@@ -55,8 +48,11 @@ import org.hibernate.search.spatial.impl.Point; import org.hibernate.search.util.common.SearchTimeoutException; import org.hibernate.transform.ResultTransformer; -import org.hibernate.type.Type; ++import jakarta.persistence.FlushModeType; ++import jakarta.persistence.LockModeType; ++import jakarta.persistence.PersistenceException; ++import jakarta.persistence.QueryTimeoutException; import org.apache.lucene.search.Explanation; import org.apache.lucene.search.Query; + import org.apache.lucene.search.Sort; @@ -68,14 +64,14 @@ * @author Hardy Ferentschik */ @@ -95,27 +198,34 @@ index c6481cc62e..8e34239ef1 100644 this.searchSession = searchSession; this.hSearchQuery = searchIntegrator.createHSQuery( luceneQuery, searchSession, loadingOptionsContributor, entities ); -@@ -117,15 +114,11 @@ public List getResultList() { - return list(); +@@ -118,54 +115,61 @@ public List getResultList() { } -- @Override + @Override - public Iterator iterate() { - throw new UnsupportedOperationException( "iterate() is not implemented in Hibernate Search queries. Use scroll() instead." ); -- } -- ++ public ScrollableResultsImplementor scroll() { ++ return scroll( ScrollMode.FORWARD_ONLY ); + } + @Override - public ScrollableResultsImplementor scroll() { +- public ScrollableResultsImplementor scroll() { - SearchScroll scroll = hSearchQuery.scroll( - fetchSize != null ? fetchSize : 100 ); ++ protected ScrollableResultsImplementor doScroll(ScrollMode scrollMode) { + extractQueryOptions(); + SearchScroll scroll = hSearchQuery.scroll( fetchSize != null ? fetchSize : 100 ); + Integer maxResults = hSearchQuery.maxResults(); return new HibernateOrmSearchScrollableResultsAdapter<>( scroll, maxResults != null ? maxResults : Integer.MAX_VALUE, Search5ScrollHitExtractor.INSTANCE ); -@@ -138,34 +131,45 @@ public ScrollableResultsImplementor scroll(ScrollMode scrollMode) { + } +- @Override +- public ScrollableResultsImplementor scroll(ScrollMode scrollMode) { +- return scroll(); +- } +- @Override public List list() { - // Reproduce the behavior of AbstractProducedQuery.list() regarding exceptions @@ -150,8 +260,8 @@ index c6481cc62e..8e34239ef1 100644 } + @Override -+ protected void beforeQuery(boolean requiresTxn) { -+ super.beforeQuery( requiresTxn ); ++ protected void beforeQuery() { ++ super.beforeQuery(); + + extractQueryOptions(); + } @@ -190,7 +300,26 @@ index c6481cc62e..8e34239ef1 100644 } } -@@ -214,44 +224,16 @@ public FullTextQueryImpl setSpatialParameters(double latitude, double longitude, +@@ -189,11 +199,16 @@ public int doGetResultSize() { + } + + @Override +- public FullTextQueryImpl applyGraph(RootGraph graph, GraphSemantic semantic) { +- entityGraphHints.add( new EntityGraphHint<>( graph, semantic ) ); ++ public FullTextQuery applyGraph(RootGraph graph, GraphSemantic semantic) { ++ applyGraph( (RootGraphImplementor) graph, semantic ); + return this; + } + ++ @Override ++ protected void applyGraph(RootGraphImplementor graph, GraphSemantic semantic) { ++ entityGraphHints.add( new EntityGraphHint<>( graph, semantic ) ); ++ } ++ + @Override + public FullTextQueryImpl setProjection(String... fields) { + hSearchQuery.projection( fields ); +@@ -214,44 +229,16 @@ public FullTextQueryImpl setSpatialParameters(double latitude, double longitude, @Override public FullTextQuery setMaxResults(int maxResults) { @@ -237,7 +366,7 @@ index c6481cc62e..8e34239ef1 100644 @Override @SuppressWarnings("deprecation") public FullTextQuery setHint(String hintName, Object value) { -@@ -266,117 +248,56 @@ public FullTextQuery setHint(String hintName, Object value) { +@@ -266,14 +253,11 @@ public FullTextQuery setHint(String hintName, Object value) { break; case HibernateOrmSearchQueryHints.JAVAX_FETCHGRAPH: case HibernateOrmSearchQueryHints.JAKARTA_FETCHGRAPH: @@ -246,23 +375,14 @@ index c6481cc62e..8e34239ef1 100644 case HibernateOrmSearchQueryHints.JAVAX_LOADGRAPH: case HibernateOrmSearchQueryHints.JAKARTA_LOADGRAPH: - applyGraph( hintValueToEntityGraph( value ), GraphSemantic.LOAD ); -+ applyEntityGraphQueryHint( hintName, hintValueToEntityGraph( value ) ); ++ applyEntityGraphHint( hintName, hintValueToEntityGraph( value ) ); break; default: - handleUnrecognizedHint( hintName, value ); break; } return this; - } - -+ @Override -+ protected void applyEntityGraphQueryHint(String hintName, RootGraphImplementor entityGraph) { -+ GraphSemantic graphSemantic = GraphSemantic.fromJpaHintName( hintName ); -+ this.applyGraph( entityGraph, graphSemantic ); -+ } -+ - @Override - public Map getHints() { +@@ -284,99 +268,35 @@ public Map getHints() { return hints; } @@ -285,15 +405,29 @@ index c6481cc62e..8e34239ef1 100644 @Override - public FullTextQueryImpl setParameter(String name, Object value) { -- throw parametersNoSupported(); -- } -- -- @Override ++ public QueryParameterBindings getParameterBindings() { ++ // parameters not supported in Hibernate Search queries ++ return QueryParameterBindings.NO_PARAM_BINDINGS; ++ } ++ ++ @Override ++ public QueryParameterBindings getQueryParameterBindings() { ++ // parameters not supported in Hibernate Search queries ++ return QueryParameterBindings.NO_PARAM_BINDINGS; ++ } ++ ++ @Override ++ public QueryImplementor setParameterList(String name, Object[] values) { + throw parametersNoSupported(); + } + + @Override - public FullTextQueryImpl setParameter(String name, Date value, TemporalType temporalType) { -- throw parametersNoSupported(); -- } -- -- @Override ++ public QueryImplementor setParameterList(String s, Collection collection, Class aClass) { + throw parametersNoSupported(); + } + + @Override - public FullTextQueryImpl setParameter(String name, Calendar value, TemporalType temporalType) { - throw parametersNoSupported(); - } @@ -312,29 +446,19 @@ index c6481cc62e..8e34239ef1 100644 - @SuppressWarnings("unchecked") - public Set> getParameters() { - return Collections.EMPTY_SET; -+ public QueryParameterBindings getParameterBindings() { -+ // parameters not supported in Hibernate Search queries -+ return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - protected QueryParameterBindings getQueryParameterBindings() { -+ // parameters not supported in Hibernate Search queries -+ return QueryParameterBindings.NO_PARAM_BINDINGS; -+ } -+ -+ @Override -+ public QueryImplementor setParameterList(String name, Object[] values) { - throw parametersNoSupported(); - } - - @Override +- } +- +- @Override +- protected QueryParameterBindings getQueryParameterBindings() { +- throw parametersNoSupported(); +- } +- +- @Override - public FullTextQueryImpl setParameter(int position, Calendar value, TemporalType temporalType) { -+ public QueryImplementor setParameterList(String s, Collection collection, Class aClass) { - throw parametersNoSupported(); - } - - @Override +- throw parametersNoSupported(); +- } +- +- @Override - public QueryParameter getParameter(String name) { - throw parametersNoSupported(); - } @@ -375,7 +499,7 @@ index c6481cc62e..8e34239ef1 100644 throw parametersNoSupported(); } -@@ -391,12 +312,7 @@ public FullTextQueryImpl setFlushMode(FlushModeType flushModeType) { +@@ -391,12 +311,7 @@ public FullTextQueryImpl setFlushMode(FlushModeType flushModeType) { @Override public FullTextQueryImpl setFetchSize(int fetchSize) { @@ -389,7 +513,7 @@ index c6481cc62e..8e34239ef1 100644 } @Override -@@ -434,7 +350,12 @@ public Object unwrap(Class type) { +@@ -434,7 +349,12 @@ public Object unwrap(Class type) { if ( type == org.apache.lucene.search.Query.class ) { return hSearchQuery.getLuceneQuery(); } @@ -403,7 +527,7 @@ index c6481cc62e..8e34239ef1 100644 } @Override -@@ -457,7 +378,12 @@ private UnsupportedOperationException lockOptionsNotSupported() { +@@ -457,7 +377,12 @@ private UnsupportedOperationException lockOptionsNotSupported() { } @Override @@ -417,7 +541,7 @@ index c6481cc62e..8e34239ef1 100644 throw new UnsupportedOperationException( "executeUpdate is not supported in Hibernate Search queries" ); } -@@ -515,32 +441,13 @@ public String getQueryString() { +@@ -515,32 +440,13 @@ public String getQueryString() { } @Override @@ -454,7 +578,7 @@ index c6481cc62e..8e34239ef1 100644 } @Override -@@ -549,12 +456,12 @@ public String toString() { +@@ -549,12 +455,12 @@ public String toString() { } private static final class Search5ScrollHitExtractor @@ -469,7 +593,7 @@ index c6481cc62e..8e34239ef1 100644 if ( hit instanceof Object[] ) { return (Object[]) hit; } -@@ -562,19 +469,6 @@ public Object[] toArray(Object hit) { +@@ -562,19 +468,6 @@ public Object[] toArray(Object hit) { return new Object[] { hit }; } } @@ -489,7 +613,7 @@ index c6481cc62e..8e34239ef1 100644 } private static int hintValueToInteger(Object value) { -@@ -586,7 +480,7 @@ private static int hintValueToInteger(Object value) { +@@ -586,7 +479,7 @@ private static int hintValueToInteger(Object value) { } } diff --git a/pom.xml b/pom.xml index bac0c4f1693..88f64a952ac 100644 --- a/pom.xml +++ b/pom.xml @@ -268,10 +268,10 @@ 2.2 - 6.0.0.Beta3 + 6.0.0.CR1 https://docs.jboss.org/hibernate/orm/${parsed-version.org.hibernate.orm.majorVersion}.${parsed-version.org.hibernate.orm.minorVersion}/javadocs/ https://docs.jboss.org/hibernate/orm/${parsed-version.org.hibernate.orm.majorVersion}.${parsed-version.org.hibernate.orm.minorVersion}/userguide/html_single/Hibernate_User_Guide.html - 5.1.2.Final + 6.0.0.CR1 3.0.0 diff --git a/util/internal/integrationtest/mapper/orm/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java b/util/internal/integrationtest/mapper/orm/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java index 594e3900a31..0f6d5898f6d 100644 --- a/util/internal/integrationtest/mapper/orm/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java +++ b/util/internal/integrationtest/mapper/orm/src/main/java/org/hibernate/search/util/impl/integrationtest/mapper/orm/ReusableOrmSetupHolder.java @@ -505,17 +505,21 @@ private static void clearEntityInstances(SessionFactoryImplementor sessionFactor } private static Query selectAllOfSpecificType(EntityType entityType, Session session) { - return createSelectOrDeleteAllOfSpecificTypeQuery( entityType, session, "" ); + return createSelectOrDeleteAllOfSpecificTypeQuery( entityType, session, QueryType.SELECT ); } private static Query deleteAllOfSpecificType(EntityType entityType, Session session) { - return createSelectOrDeleteAllOfSpecificTypeQuery( entityType, session, "delete " ); + return createSelectOrDeleteAllOfSpecificTypeQuery( entityType, session, QueryType.DELETE ); } - private static Query createSelectOrDeleteAllOfSpecificTypeQuery(EntityType entityType, Session session, String prefix) { - StringBuilder builder = ( prefix == null || prefix.trim().isEmpty() ) ? - new StringBuilder( "select e " ) : - new StringBuilder( prefix ); + enum QueryType { + SELECT, + DELETE + } + + private static Query createSelectOrDeleteAllOfSpecificTypeQuery(EntityType entityType, Session session, + QueryType queryType) { + StringBuilder builder = new StringBuilder( QueryType.SELECT.equals( queryType ) ? "select e " : "delete " ); builder.append( "from " ).append( entityType.getName() ).append( " e" ); Class typeArg = null; @@ -527,7 +531,9 @@ private static Query createSelectOrDeleteAllOfSpecificTypeQuery(EntityType builder.append( " where type( e ) in (:type)" ); typeArg = entityType.getJavaType(); } - Query query = session.createQuery( builder.toString() ); + Query query = QueryType.SELECT.equals( queryType ) + ? session.createQuery( builder.toString(), entityType.getJavaType() ) + : session.createQuery( builder.toString() ); if ( typeArg != null ) { query.setParameter( "type", typeArg ); }