diff --git a/bom/application/pom.xml b/bom/application/pom.xml index 2c1f4e14984b7..3c4e3e4ed6043 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -76,7 +76,7 @@ 2.1.3 3.0.1 2.0.1 - 3.1.0 + 3.2.0 2.1.0 6.0.0 2.0.1 @@ -1154,6 +1154,16 @@ quarkus-hibernate-orm-deployment ${project.version} + + io.quarkus + quarkus-hibernate-orm-derby + ${project.version} + + + io.quarkus + quarkus-hibernate-orm-derby-deployment + ${project.version} + io.quarkus quarkus-hibernate-envers @@ -5341,10 +5351,11 @@ ${hibernate-orm.version} - + + diff --git a/devtools/bom-descriptor-json/pom.xml b/devtools/bom-descriptor-json/pom.xml index 59f92096d0541..cd67dd251cafa 100644 --- a/devtools/bom-descriptor-json/pom.xml +++ b/devtools/bom-descriptor-json/pom.xml @@ -837,6 +837,19 @@ + + io.quarkus + quarkus-hibernate-orm-derby + ${project.version} + pom + test + + + * + * + + + io.quarkus quarkus-hibernate-orm-panache diff --git a/docs/pom.xml b/docs/pom.xml index 29dd7a55c0a9f..da886422f6ff2 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -848,6 +848,19 @@ + + io.quarkus + quarkus-hibernate-orm-derby-deployment + ${project.version} + pom + test + + + * + * + + + io.quarkus quarkus-hibernate-orm-panache-deployment diff --git a/extensions/hibernate-orm-derby/deployment/pom.xml b/extensions/hibernate-orm-derby/deployment/pom.xml new file mode 100644 index 0000000000000..348387d604fc0 --- /dev/null +++ b/extensions/hibernate-orm-derby/deployment/pom.xml @@ -0,0 +1,60 @@ + + + + quarkus-hibernate-orm-derby-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 + + quarkus-hibernate-orm-derby-deployment + Quarkus - Hibernate ORM - Derby - Deployment + This extensions is added by Quarkus automatically when quarkus-hibernate-orm and quarkus-jdbc-derby are on the classpath + + + + io.quarkus + quarkus-core-deployment + + + + io.quarkus + quarkus-hibernate-orm-deployment-spi + + + io.quarkus + quarkus-datasource-common + + + + io.quarkus + quarkus-hibernate-orm-derby + + + + + + + maven-compiler-plugin + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + + + + diff --git a/extensions/hibernate-orm-derby/deployment/src/main/java/HibernateOrmDerbyProcessor.java b/extensions/hibernate-orm-derby/deployment/src/main/java/HibernateOrmDerbyProcessor.java new file mode 100644 index 0000000000000..96713e5cf2153 --- /dev/null +++ b/extensions/hibernate-orm-derby/deployment/src/main/java/HibernateOrmDerbyProcessor.java @@ -0,0 +1,14 @@ +import java.util.Set; + +import io.quarkus.datasource.common.runtime.DatabaseKind; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.hibernate.orm.deployment.spi.DatabaseKindDialectBuildItem; + +public final class HibernateOrmDerbyProcessor { + @BuildStep + void registerHibernateOrmMetadataForDerbyDialect(BuildProducer producer) { + producer.produce(DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.DERBY, "Apache Derby", + Set.of("org.hibernate.community.dialect.DerbyDialect"))); + } +} diff --git a/extensions/hibernate-orm-derby/pom.xml b/extensions/hibernate-orm-derby/pom.xml new file mode 100644 index 0000000000000..a381ea0a21d8c --- /dev/null +++ b/extensions/hibernate-orm-derby/pom.xml @@ -0,0 +1,21 @@ + + + + + quarkus-extensions-parent + io.quarkus + 999-SNAPSHOT + ../pom.xml + + 4.0.0 + + quarkus-hibernate-orm-derby-parent + Quarkus - Hibernate ORM - Derby - Deployment + pom + + runtime + deployment + + diff --git a/extensions/hibernate-orm-derby/runtime/pom.xml b/extensions/hibernate-orm-derby/runtime/pom.xml new file mode 100644 index 0000000000000..5dcf5cf656c0c --- /dev/null +++ b/extensions/hibernate-orm-derby/runtime/pom.xml @@ -0,0 +1,69 @@ + + + + quarkus-hibernate-orm-derby-parent + io.quarkus + 999-SNAPSHOT + + 4.0.0 + + quarkus-hibernate-orm-derby + Quarkus - Hibernate ORM - Derby - Deployment + This extensions is added by Quarkus automatically when quarkus-hibernate-orm and quarkus-jdbc-derby are on the classpath + + + + io.quarkus + quarkus-core + + + org.hibernate.orm + hibernate-community-dialects + + + + + + + io.quarkus + quarkus-extension-maven-plugin + + + compile + + extension-descriptor + + + ${project.groupId}:${project.artifactId}-deployment:${project.version} + + io.quarkus:quarkus-hibernate-orm + io.quarkus:quarkus-jdbc-derby + + + + + + + maven-compiler-plugin + + + default-compile + + + + io.quarkus + quarkus-extension-processor + ${project.version} + + + + + + + + + + + diff --git a/extensions/hibernate-orm-derby/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/hibernate-orm-derby/runtime/src/main/resources/META-INF/quarkus-extension.yaml new file mode 100644 index 0000000000000..0ae1a6c04092e --- /dev/null +++ b/extensions/hibernate-orm-derby/runtime/src/main/resources/META-INF/quarkus-extension.yaml @@ -0,0 +1,6 @@ +name: Quarkus Hibernate ORM Derby +artifact: ${project.groupId}:${project.artifactId}:${project.version} +description: Conditional extension added when Hibernate ORM and the Derby JDBC driver are present +metadata: + unlisted: true + diff --git a/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java b/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java index 0087e4334b4f7..7e924ed3d8789 100644 --- a/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java +++ b/extensions/hibernate-orm/deployment-spi/src/main/java/io/quarkus/hibernate/orm/deployment/spi/DatabaseKindDialectBuildItem.java @@ -19,6 +19,8 @@ public final class DatabaseKindDialectBuildItem extends MultiBuildItem { * @param dbKind The DB Kind set through {@code quarkus.datasource.db-kind} * @param databaseProductName The corresponding database-product-name to set in Hibernate ORM. * See {@code org.hibernate.dialect.Database} for information on how this name is resolved to a dialect. + * Also works with {@code org.hibernate.community.dialect.CommunityDatabase} if + * {@code hibernate-community-dialects} is in the classpath. * @param dialects The corresponding dialects in Hibernate ORM, * to detect the dbKind when using database multi-tenancy. */ @@ -32,6 +34,8 @@ public static DatabaseKindDialectBuildItem forCoreDialect(String dbKind, String * @param dbKind The DB Kind set through {@code quarkus.datasource.db-kind} * @param databaseProductName The corresponding database-product-name to set in Hibernate ORM. * See {@code org.hibernate.dialect.Database} for information on how this name is resolved to a dialect. + * Also works with {@code org.hibernate.community.dialect.CommunityDatabase} if + * {@code hibernate-community-dialects} is in the classpath. * @param dialects The corresponding dialects in Hibernate ORM, * to detect the dbKind when using database multi-tenancy. * @param defaultDatabaseProductVersion The default database-product-version to set in Hibernate ORM. diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java index 3f79f8d71ba34..5181b06374143 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/ClassNames.java @@ -44,7 +44,6 @@ private static DotName createConstant(String fqcn) { public static final DotName EMBEDDED = createConstant("jakarta.persistence.Embedded"); public static final DotName EMBEDDED_ID = createConstant("jakarta.persistence.EmbeddedId"); public static final DotName ELEMENT_COLLECTION = createConstant("jakarta.persistence.ElementCollection"); - public static final DotName PROXY = createConstant("org.hibernate.annotations.Proxy"); public static final DotName HIBERNATE_PROXY = createConstant("org.hibernate.proxy.HibernateProxy"); public static final DotName TYPE = createConstant("org.hibernate.annotations.Type"); public static final DotName INJECT_SERVICE = createConstant("org.hibernate.service.spi.InjectService"); @@ -61,6 +60,7 @@ private static DotName createConstant(String fqcn) { public static final DotName XML_FORMAT = createConstant("io.quarkus.hibernate.orm.XmlFormat"); public static final List GENERATORS = List.of( + createConstant("org.hibernate.generator.Assigned"), createConstant("org.hibernate.generator.internal.CurrentTimestampGeneration"), createConstant("org.hibernate.generator.internal.GeneratedAlwaysGeneration"), createConstant("org.hibernate.generator.internal.GeneratedGeneration"), @@ -78,10 +78,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.id.UUIDHexGenerator"), createConstant("org.hibernate.id.enhanced.SequenceStyleGenerator"), createConstant("org.hibernate.id.enhanced.TableGenerator"), - createConstant("org.hibernate.id.uuid.UuidGenerator"), - createConstant("org.hibernate.tuple.CreationTimestampGeneration"), - createConstant("org.hibernate.tuple.UpdateTimestampGeneration"), - createConstant("org.hibernate.tuple.VmValueGeneration")); + createConstant("org.hibernate.id.uuid.UuidGenerator")); public static final List PACKAGE_ANNOTATIONS = List.of( createConstant("org.hibernate.annotations.CollectionTypeRegistration"), @@ -110,7 +107,11 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.NamedNativeQuery"), createConstant("org.hibernate.annotations.NamedQueries"), createConstant("org.hibernate.annotations.NamedQuery"), + createConstant("jakarta.persistence.SequenceGenerator"), + createConstant("jakarta.persistence.SequenceGenerators"), createConstant("org.hibernate.annotations.SoftDelete"), + createConstant("jakarta.persistence.TableGenerator"), + createConstant("jakarta.persistence.TableGenerators"), createConstant("org.hibernate.annotations.TypeRegistration"), createConstant("org.hibernate.annotations.TypeRegistrations")); @@ -122,6 +123,7 @@ private static DotName createConstant(String fqcn) { createConstant("jakarta.persistence.AttributeOverrides"), createConstant("jakarta.persistence.Basic"), createConstant("jakarta.persistence.Cacheable"), + createConstant("jakarta.persistence.CheckConstraint"), createConstant("jakarta.persistence.CollectionTable"), createConstant("jakarta.persistence.Column"), createConstant("jakarta.persistence.ColumnResult"), @@ -135,6 +137,7 @@ private static DotName createConstant(String fqcn) { createConstant("jakarta.persistence.Embeddable"), createConstant("jakarta.persistence.Embedded"), createConstant("jakarta.persistence.EmbeddedId"), + createConstant("jakarta.persistence.EnumeratedValue"), createConstant("jakarta.persistence.Entity"), createConstant("jakarta.persistence.EntityListeners"), createConstant("jakarta.persistence.EntityResult"), @@ -247,6 +250,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.ConcreteProxy"), createConstant("org.hibernate.annotations.ConverterRegistration"), createConstant("org.hibernate.annotations.ConverterRegistrations"), + createConstant("org.hibernate.boot.models.Copied"), createConstant("org.hibernate.annotations.CreationTimestamp"), createConstant("org.hibernate.annotations.CurrentTimestamp"), createConstant("org.hibernate.annotations.DialectOverride$Check"), @@ -283,8 +287,6 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.DialectOverride$SQLUpdate"), createConstant("org.hibernate.annotations.DialectOverride$SQLUpdates"), createConstant("org.hibernate.annotations.DialectOverride$Version"), - createConstant("org.hibernate.annotations.DialectOverride$Where"), - createConstant("org.hibernate.annotations.DialectOverride$Wheres"), createConstant("org.hibernate.annotations.DiscriminatorFormula"), createConstant("org.hibernate.annotations.DiscriminatorOptions"), createConstant("org.hibernate.annotations.DynamicInsert"), @@ -304,20 +306,16 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.FilterJoinTable"), createConstant("org.hibernate.annotations.FilterJoinTables"), createConstant("org.hibernate.annotations.Filters"), - createConstant("org.hibernate.annotations.ForeignKey"), createConstant("org.hibernate.annotations.Formula"), createConstant("org.hibernate.annotations.FractionalSeconds"), createConstant("org.hibernate.annotations.Generated"), createConstant("org.hibernate.annotations.GeneratedColumn"), - createConstant("org.hibernate.annotations.GeneratorType"), createConstant("org.hibernate.annotations.GenericGenerator"), createConstant("org.hibernate.annotations.GenericGenerators"), createConstant("org.hibernate.annotations.HQLSelect"), createConstant("org.hibernate.annotations.IdGeneratorType"), createConstant("org.hibernate.annotations.Immutable"), createConstant("org.hibernate.annotations.Imported"), - createConstant("org.hibernate.annotations.Index"), - createConstant("org.hibernate.annotations.IndexColumn"), createConstant("org.hibernate.annotations.Instantiator"), createConstant("org.hibernate.annotations.JavaType"), createConstant("org.hibernate.annotations.JavaTypeRegistration"), @@ -329,14 +327,11 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.JoinColumnOrFormula"), createConstant("org.hibernate.annotations.JoinColumnsOrFormulas"), createConstant("org.hibernate.annotations.JoinFormula"), - createConstant("org.hibernate.annotations.LazyCollection"), createConstant("org.hibernate.annotations.LazyGroup"), - createConstant("org.hibernate.annotations.LazyToOne"), createConstant("org.hibernate.annotations.ListIndexBase"), createConstant("org.hibernate.annotations.ListIndexJavaType"), createConstant("org.hibernate.annotations.ListIndexJdbcType"), createConstant("org.hibernate.annotations.ListIndexJdbcTypeCode"), - createConstant("org.hibernate.annotations.Loader"), createConstant("org.hibernate.annotations.ManyToAny"), createConstant("org.hibernate.annotations.MapKeyJavaType"), createConstant("org.hibernate.annotations.MapKeyJdbcType"), @@ -360,9 +355,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.Parameter"), createConstant("org.hibernate.annotations.Parent"), createConstant("org.hibernate.annotations.PartitionKey"), - createConstant("org.hibernate.annotations.Persister"), - createConstant("org.hibernate.annotations.Polymorphism"), - createConstant("org.hibernate.annotations.Proxy"), + createConstant("org.hibernate.annotations.PropertyRef"), createConstant("org.hibernate.annotations.QueryCacheLayout"), createConstant("org.hibernate.annotations.RowId"), createConstant("org.hibernate.annotations.SQLDelete"), @@ -378,7 +371,6 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.SQLUpdates"), createConstant("org.hibernate.annotations.SecondaryRow"), createConstant("org.hibernate.annotations.SecondaryRows"), - createConstant("org.hibernate.annotations.SelectBeforeUpdate"), createConstant("org.hibernate.annotations.SoftDelete"), createConstant("org.hibernate.annotations.SortComparator"), createConstant("org.hibernate.annotations.SortNatural"), @@ -387,8 +379,6 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.Struct"), createConstant("org.hibernate.annotations.Subselect"), createConstant("org.hibernate.annotations.Synchronize"), - createConstant("org.hibernate.annotations.Table"), - createConstant("org.hibernate.annotations.Tables"), createConstant("org.hibernate.annotations.Target"), createConstant("org.hibernate.annotations.TenantId"), createConstant("org.hibernate.annotations.TimeZoneColumn"), @@ -400,9 +390,7 @@ private static DotName createConstant(String fqcn) { createConstant("org.hibernate.annotations.UpdateTimestamp"), createConstant("org.hibernate.annotations.UuidGenerator"), createConstant("org.hibernate.annotations.ValueGenerationType"), - createConstant("org.hibernate.annotations.View"), - createConstant("org.hibernate.annotations.Where"), - createConstant("org.hibernate.annotations.WhereJoinTable")); + createConstant("org.hibernate.annotations.View")); public static final List ANNOTATED_WITH_INJECT_SERVICE = List.of( createConstant("org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl")); diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java index 2aa61f22adc2f..a1b213404bcb5 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java @@ -50,10 +50,9 @@ import org.hibernate.internal.util.collections.ArrayHelper; import org.hibernate.jpa.boot.spi.JpaSettings; import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; -import org.hibernate.loader.BatchFetchStyle; +import org.hibernate.jpa.boot.spi.PersistenceXmlParser; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget.Kind; -import org.jboss.jandex.AnnotationValue; import org.jboss.jandex.ClassInfo; import org.jboss.jandex.CompositeIndex; import org.jboss.jandex.DotName; @@ -130,6 +129,7 @@ import io.quarkus.hibernate.orm.runtime.proxies.PreGeneratedProxies; import io.quarkus.hibernate.orm.runtime.recording.RecordedConfig; import io.quarkus.hibernate.orm.runtime.schema.SchemaManagementIntegrator; +import io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService; import io.quarkus.hibernate.orm.runtime.tenant.DataSourceTenantConnectionResolver; import io.quarkus.hibernate.orm.runtime.tenant.TenantConnectionResolver; import io.quarkus.panache.common.deployment.HibernateEnhancersRegisteredBuildItem; @@ -165,8 +165,6 @@ void registerHibernateOrmMetadataForCoreDialects( BuildProducer producer) { producer.produce(DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.DB2, "DB2", Set.of("org.hibernate.dialect.DB2Dialect"))); - producer.produce(DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.DERBY, "Apache Derby", - Set.of("org.hibernate.dialect.DerbyDialect"))); producer.produce(DatabaseKindDialectBuildItem.forCoreDialect(DatabaseKind.H2, "H2", Set.of("org.hibernate.dialect.H2Dialect"), // Using our own default version is extra important for H2 @@ -256,8 +254,12 @@ List hotDeploymentWatchedFiles(HibernateOrmCo public void parsePersistenceXmlDescriptors(HibernateOrmConfig config, BuildProducer persistenceXmlDescriptorBuildItemBuildProducer) { if (!shouldIgnorePersistenceXmlResources(config)) { - var explicitDescriptors = QuarkusPersistenceXmlParser.locatePersistenceUnits(); - for (var desc : explicitDescriptors) { + var parser = PersistenceXmlParser.create(Map.of(), null, FlatClassLoaderService.INSTANCE); + var urls = parser.getClassLoaderService().locateResources("META-INF/persistence.xml"); + if (urls.isEmpty()) { + return; + } + for (var desc : parser.parse(urls).values()) { persistenceXmlDescriptorBuildItemBuildProducer.produce(new PersistenceXmlDescriptorBuildItem(desc)); } } @@ -976,7 +978,6 @@ private static void producePersistenceUnitDescriptorFromConfig( if (batchSize > 0) { descriptor.getProperties().setProperty(AvailableSettings.DEFAULT_BATCH_FETCH_SIZE, Integer.toString(batchSize)); - descriptor.getProperties().setProperty(AvailableSettings.BATCH_FETCH_STYLE, BatchFetchStyle.PADDED.toString()); } if (persistenceUnitConfig.fetch().maxDepth().isPresent()) { @@ -1531,14 +1532,6 @@ private PreGeneratedProxies generatedProxies(Set managedClassAndPackageN } //create a map of entity to proxy type PreGeneratedProxies preGeneratedProxies = new PreGeneratedProxies(); - Map proxyAnnotations = new HashMap<>(); - for (AnnotationInstance i : combinedIndex.getAnnotations(ClassNames.PROXY)) { - AnnotationValue proxyClass = i.value("proxyClass"); - if (proxyClass == null) { - continue; - } - proxyAnnotations.put(i.target().asClass().name().toString(), proxyClass.asClass().name().toString()); - } TypePool transformedClassesTypePool = createTransformedClassesTypePool(transformedClassesBuildItem, managedClassAndPackageNames); try (ProxyBuildingHelper proxyHelper = new ProxyBuildingHelper(transformedClassesTypePool)) { @@ -1550,28 +1543,11 @@ private PreGeneratedProxies generatedProxies(Set managedClassAndPackageN } else { Set proxyInterfaceNames = new TreeSet<>(); proxyInterfaceNames.add(ClassNames.HIBERNATE_PROXY.toString()); //always added - String proxy = proxyAnnotations.get(managedClassOrPackageName); - if (proxy == null) { - if (!proxyHelper.isProxiable(managedClassOrPackageName)) { - //if there is no @Proxy we need to make sure the actual class is proxiable - continue; - } - } else { - proxyInterfaceNames.add(proxy); + if (!proxyHelper.isProxiable(managedClassOrPackageName)) { + // we need to make sure the actual class is proxiable + continue; } final String mappedClass = managedClassOrPackageName; - for (ClassInfo subclass : combinedIndex - .getAllKnownSubclasses(DotName.createSimple(managedClassOrPackageName))) { - String subclassName = subclass.name().toString(); - if (!managedClassAndPackageNames.contains(subclassName)) { - //not an entity - continue; - } - proxy = proxyAnnotations.get(subclassName); - if (proxy != null) { - proxyInterfaceNames.add(proxy); - } - } DynamicType.Unloaded unloaded = proxyHelper.buildUnloadedProxy(mappedClass, proxyInterfaceNames); result = new CachedProxy(unloaded, proxyInterfaceNames); proxyCache.cache.put(managedClassOrPackageName, result); diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java index d7e2120e2a3c5..daa8d4ddb6a11 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/JpaJandexScavenger.java @@ -19,17 +19,11 @@ import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmJoinedSubclassEntityType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmRootEntityType; import org.hibernate.boot.jaxb.hbm.spi.JaxbHbmUnionSubclassEntityType; -import org.hibernate.boot.jaxb.mapping.EntityOrMappedSuperclass; -import org.hibernate.boot.jaxb.mapping.JaxbConverter; -import org.hibernate.boot.jaxb.mapping.JaxbEmbeddable; -import org.hibernate.boot.jaxb.mapping.JaxbEntity; -import org.hibernate.boot.jaxb.mapping.JaxbEntityListener; -import org.hibernate.boot.jaxb.mapping.JaxbEntityListeners; -import org.hibernate.boot.jaxb.mapping.JaxbEntityMappings; -import org.hibernate.boot.jaxb.mapping.JaxbMappedSuperclass; -import org.hibernate.boot.jaxb.mapping.JaxbPersistenceUnitDefaults; -import org.hibernate.boot.jaxb.mapping.JaxbPersistenceUnitMetadata; -import org.hibernate.boot.jaxb.mapping.ManagedType; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntity; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityListenerContainerImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityMappingsImpl; +import org.hibernate.boot.jaxb.mapping.spi.JaxbEntityOrMappedSuperclass; +import org.hibernate.boot.jaxb.mapping.spi.JaxbManagedType; import org.jboss.jandex.AnnotationInstance; import org.jboss.jandex.AnnotationTarget; import org.jboss.jandex.ClassInfo; @@ -185,32 +179,33 @@ private void enlistExplicitMappings(Collector collector, } } - private void enlistOrmXmlMapping(Collector collector, JaxbEntityMappings mapping) { + private void enlistOrmXmlMapping(Collector collector, JaxbEntityMappingsImpl mapping) { String packageName = mapping.getPackage(); String packagePrefix = packageName == null ? "" : packageName + "."; - JaxbPersistenceUnitMetadata metadata = mapping.getPersistenceUnitMetadata(); - JaxbPersistenceUnitDefaults defaults = metadata == null ? null : metadata.getPersistenceUnitDefaults(); + var metadata = mapping.getPersistenceUnitMetadata(); + var defaults = metadata == null ? null : metadata.getPersistenceUnitDefaults(); if (defaults != null) { - enlistOrmXmlMappingListeners(collector, packagePrefix, defaults.getEntityListeners()); + enlistOrmXmlMappingListeners(collector, packagePrefix, defaults.getEntityListenerContainer()); } - for (JaxbEntity entity : mapping.getEntities()) { + for (var entity : mapping.getEntities()) { enlistOrmXmlMappingManagedClass(collector, packagePrefix, entity, "entity"); } - for (JaxbMappedSuperclass mappedSuperclass : mapping.getMappedSuperclasses()) { + for (var mappedSuperclass : mapping.getMappedSuperclasses()) { enlistOrmXmlMappingManagedClass(collector, packagePrefix, mappedSuperclass, "mapped-superclass"); } - for (JaxbEmbeddable embeddable : mapping.getEmbeddables()) { + for (var embeddable : mapping.getEmbeddables()) { String name = safeGetClassName(packagePrefix, embeddable, "embeddable"); enlistExplicitClass(collector, name); } - for (JaxbConverter converter : mapping.getConverters()) { + for (var converter : mapping.getConverters()) { collector.potentialCdiBeanTypes.add(DotName.createSimple(qualifyIfNecessary(packagePrefix, converter.getClazz()))); } } - private void enlistOrmXmlMappingManagedClass(Collector collector, String packagePrefix, EntityOrMappedSuperclass managed, + private void enlistOrmXmlMappingManagedClass(Collector collector, String packagePrefix, + JaxbEntityOrMappedSuperclass managed, String nodeName) { String name = safeGetClassName(packagePrefix, managed, nodeName); enlistExplicitClass(collector, name); @@ -220,19 +215,20 @@ private void enlistOrmXmlMappingManagedClass(Collector collector, String package collector.entityTypes.add(name); } - enlistOrmXmlMappingListeners(collector, packagePrefix, managed.getEntityListeners()); + enlistOrmXmlMappingListeners(collector, packagePrefix, managed.getEntityListenerContainer()); } - private void enlistOrmXmlMappingListeners(Collector collector, String packagePrefix, JaxbEntityListeners entityListeners) { + private void enlistOrmXmlMappingListeners(Collector collector, String packagePrefix, + JaxbEntityListenerContainerImpl entityListeners) { if (entityListeners == null) { return; } - for (JaxbEntityListener listener : entityListeners.getEntityListener()) { + for (var listener : entityListeners.getEntityListeners()) { collector.potentialCdiBeanTypes.add(DotName.createSimple(qualifyIfNecessary(packagePrefix, listener.getClazz()))); } } - private static String safeGetClassName(String packagePrefix, ManagedType managedType, String nodeName) { + private static String safeGetClassName(String packagePrefix, JaxbManagedType managedType, String nodeName) { String name = managedType.getClazz(); if (name == null) { throw new IllegalArgumentException("Missing attribute '" + nodeName + ".class'"); diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java deleted file mode 100644 index 508178dd4aab9..0000000000000 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.quarkus.hibernate.orm.deployment; - -import java.net.URL; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import jakarta.persistence.spi.PersistenceUnitTransactionType; - -import org.hibernate.jpa.boot.internal.PersistenceXmlParser; -import org.hibernate.jpa.boot.spi.PersistenceUnitDescriptor; - -import io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService; - -/** - * Similar to Hibernate ORM's PersistenceXmlParser to adapt it to - * specific needs in Quarkus. - */ -final class QuarkusPersistenceXmlParser extends PersistenceXmlParser { - - /** - * Similar to {@link PersistenceXmlParser#locatePersistenceUnits(Map)} - * except it doesn't need a properties map, and avoids complaining if no resources are found. - * - * @return the list of ParsedPersistenceXmlDescriptor(s), after discovery and parsing. - */ - public static List locatePersistenceUnits() { - final QuarkusPersistenceXmlParser parser = new QuarkusPersistenceXmlParser(); - parser.doResolve(); - return parser.getResolvedPersistenceUnits(); - } - - private QuarkusPersistenceXmlParser() { - //N.B. RESOURCE_LOCAL is matching the default in Hibernate ORM; we use the same here as persistence.xml is treated as "legacy" - // yet this is not the default that Quarkus will use when booting via `application.properties`. - super(FlatClassLoaderService.INSTANCE, PersistenceUnitTransactionType.RESOURCE_LOCAL); - } - - private void doResolve() { - final List xmlUrls = FlatClassLoaderService.INSTANCE.locateResources("META-INF/persistence.xml"); - for (URL xmlUrl : xmlUrls) { - parsePersistenceXml(xmlUrl, Collections.emptyMap()); - } - } - -} diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java index 069bee4cd90a2..3c51d87421789 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/xml/QuarkusMappingFileParser.java @@ -9,6 +9,7 @@ import org.hibernate.boot.archive.internal.ArchiveHelper; import org.hibernate.boot.jaxb.spi.Binding; +import org.hibernate.boot.jaxb.spi.JaxbBindableMappingDescriptor; import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; @@ -62,7 +63,7 @@ public Optional parse(String persistenceUnitName, URL pers } try (InputStream stream = url.openStream()) { - Binding binding = (Binding) binderAccess.bind(stream); + Binding binding = binderAccess.bind(stream); return Optional.of(RecordableXmlMapping.create(binding)); } catch (RuntimeException | IOException e) { throw new IllegalStateException( diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java index 4f9fd280eb32d..01e12bc343e2b 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/enhancer/HibernateEntityEnhancerPresentEmbeddableTest.java @@ -360,7 +360,6 @@ public void setId(EmbeddableIdWithAnnotation id) { } } - @MappedSuperclass public interface Identifiable { Object getId(); } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java index d114c555a330d..a12206a5fd781 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/ApplicationScopedInterceptorTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -14,6 +13,7 @@ import jakarta.persistence.Table; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.EmptyInterceptor; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -124,7 +124,8 @@ public ApplicationScopedInterceptor() { } @Override - public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java index 3824f3b3eb5bd..89e104be61520 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/DependentInterceptorTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -15,6 +14,7 @@ import jakarta.persistence.Table; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.EmptyInterceptor; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -127,7 +127,8 @@ public DependentInterceptor() { } @Override - public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java index 8878a756c2cb1..f40097ab4c931 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/interceptor/TransactionScopedInterceptorTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -16,6 +15,7 @@ import jakarta.transaction.TransactionScoped; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.EmptyInterceptor; import org.hibernate.Session; import org.hibernate.SessionFactory; @@ -129,7 +129,8 @@ public TransactionScopedInterceptor() { } @Override - public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java index 74b7d037bf1c0..f97a17e6ce04e 100644 --- a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/multiplepersistenceunits/MultiplePersistenceUnitsInterceptorTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -10,6 +9,7 @@ import jakarta.inject.Inject; import jakarta.transaction.UserTransaction; +import org.hibernate.CallbackException; import org.hibernate.EmptyInterceptor; import org.hibernate.Session; import org.hibernate.type.Type; @@ -116,7 +116,8 @@ public MyDefaultPUInterceptor() { } @Override - public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } @@ -134,7 +135,8 @@ public MyInventoryPUInterceptor() { } @Override - public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { + public boolean onLoad(Object entity, Object id, Object[] state, String[] propertyNames, Type[] types) + throws CallbackException { loadedIds.add(id); return false; } diff --git a/extensions/hibernate-orm/runtime/pom.xml b/extensions/hibernate-orm/runtime/pom.xml index 205773ecdff7a..1f7f5bbfb550e 100644 --- a/extensions/hibernate-orm/runtime/pom.xml +++ b/extensions/hibernate-orm/runtime/pom.xml @@ -66,12 +66,6 @@ byte-buddy compile - - - org.hibernate.common - hibernate-commons-annotations - compile - + + io.quarkus + quarkus-hibernate-orm-derby-deployment + true + io.quarkus quarkus-devservices-derby diff --git a/extensions/jdbc/jdbc-derby/runtime/pom.xml b/extensions/jdbc/jdbc-derby/runtime/pom.xml index 172374f698b9c..b6fe4d62eda81 100644 --- a/extensions/jdbc/jdbc-derby/runtime/pom.xml +++ b/extensions/jdbc/jdbc-derby/runtime/pom.xml @@ -31,6 +31,11 @@ quarkus-flyway-derby true + + io.quarkus + quarkus-hibernate-orm-derby + true + diff --git a/extensions/pom.xml b/extensions/pom.xml index c11bbaa9679a1..6af7438fd00ce 100644 --- a/extensions/pom.xml +++ b/extensions/pom.xml @@ -95,6 +95,7 @@ agroal jdbc hibernate-orm + hibernate-orm-derby hibernate-envers hibernate-reactive hibernate-validator diff --git a/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/application.properties b/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/application.properties index 6bcd1252cd1b7..70ef10963cf03 100644 --- a/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/application.properties +++ b/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/application.properties @@ -22,6 +22,7 @@ quarkus.hibernate-orm.xml-mapping-only-entity-listener.datasource=xml-mapping-on quarkus.hibernate-orm.xml-mapping-only-entity-listener.database.generation=drop-and-create quarkus.hibernate-orm.xml-mapping-only-entity-listener.packages=io.quarkus.it.jpa.mapping.xml.modern.app.xmlmappingonly.entitylistener quarkus.hibernate-orm.xml-mapping-only-entity-listener.mapping-files=xml-mapping-only-entity-listener.orm.xml +quarkus.hibernate-orm.xml-mapping-only-entity-listener.log.sql=true quarkus.hibernate-orm.libraryA.datasource=libraryA quarkus.hibernate-orm.libraryA.database.generation=drop-and-create diff --git a/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/xml-mapping-only-entity-listener.orm.xml b/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/xml-mapping-only-entity-listener.orm.xml index 5bc028339b153..8872100212d47 100644 --- a/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/xml-mapping-only-entity-listener.orm.xml +++ b/integration-tests/jpa-mapping-xml/modern-app/src/main/resources/xml-mapping-only-entity-listener.orm.xml @@ -17,6 +17,8 @@ + + @@ -36,6 +38,8 @@ + + diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java index 60b171b7355c0..086d5726d9ca9 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/integrator/TestIntegrator.java @@ -3,6 +3,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.hibernate.boot.Metadata; +import org.hibernate.boot.spi.BootstrapContext; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.integrator.spi.Integrator; import org.hibernate.service.spi.SessionFactoryServiceRegistry; @@ -11,8 +12,8 @@ public class TestIntegrator implements Integrator { public static final AtomicInteger COUNTER = new AtomicInteger(); @Override - public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, - SessionFactoryServiceRegistry serviceRegistry) { + public void integrate(Metadata metadata, BootstrapContext bootstrapContext, + SessionFactoryImplementor sessionFactory) { COUNTER.incrementAndGet(); } diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java index 30e16e8356b2a..caec426329513 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Dog.java @@ -3,12 +3,9 @@ import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; -import org.hibernate.annotations.Proxy; - @Entity -@Proxy(proxyClass = DogProxy.class) @DiscriminatorValue("DOG") -public class Dog extends Pet implements DogProxy { +public class Dog extends Pet { private String favoriteToy; @@ -17,7 +14,6 @@ public String makeNoise() { return bark(); } - @Override public String bark() { return "Woof"; } diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/DogProxy.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/DogProxy.java deleted file mode 100644 index d128fee16fe11..0000000000000 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/DogProxy.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.quarkus.it.jpa.proxy; - -public interface DogProxy { - - String bark(); - - String getFavoriteToy(); - - void setFavoriteToy(String favoriteToy); -} diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java index 8da2622a49b81..141ae784e30c3 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/Pet.java @@ -6,14 +6,11 @@ import jakarta.persistence.Id; import jakarta.persistence.Inheritance; -import org.hibernate.annotations.Proxy; - @Inheritance() @DiscriminatorColumn -@Proxy(proxyClass = PetProxy.class) @DiscriminatorValue("PET") @Entity -public class Pet implements PetProxy { +public class Pet { private Integer id; @@ -36,7 +33,6 @@ public void setName(String name) { this.name = name; } - @Override public String makeNoise() { return "Generic pet noises"; } diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/PetOwner.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/PetOwner.java index 8c430db0c82bb..bd99c0fe9b160 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/PetOwner.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/PetOwner.java @@ -14,7 +14,7 @@ public class PetOwner { String name; - PetProxy pet; + Pet pet; public String getName() { return name; @@ -33,13 +33,13 @@ public void setId(Integer id) { this.id = id; } - @OneToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity = Pet.class) + @OneToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(nullable = false) - public PetProxy getPet() { + public Pet getPet() { return pet; } - public void setPet(PetProxy pet) { + public void setPet(Pet pet) { this.pet = pet; } } diff --git a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java index be2a1564d561f..270876ea0f717 100644 --- a/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java +++ b/integration-tests/jpa/src/main/java/io/quarkus/it/jpa/proxy/ProxyTestEndpoint.java @@ -12,6 +12,8 @@ import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; +import org.hibernate.Hibernate; + import io.quarkus.narayana.jta.QuarkusTransaction; import io.quarkus.narayana.jta.runtime.TransactionConfiguration; import io.quarkus.runtime.StartupEvent; @@ -79,10 +81,13 @@ public String testBasic() { } /** - * tests for the @Proxy annotation in an inheritance hierarchy + * tests for the proxies in an inheritance hierarchy * * We need to do our own proxy generation at build time, so this tests that the logic matches what hibernate expects */ + // TODO: this previously was about the @Proxy annotation, removed in Hibernate ORM 7.0. + // We should check whether the test still makes sense... + // See also https://hibernate.zulipchat.com/#narrow/stream/132094-hibernate-orm-dev/topic/HHH-18194/near/467597335 @GET @Path("inheritance") @Transactional @@ -90,29 +95,18 @@ public String inheritance() { PetOwner owner = entityManager.find(PetOwner.class, 1); expectEquals("Stuart", owner.getName()); expectEquals("Generic pet noises", owner.getPet().makeNoise()); - expectFalse(owner.getPet() instanceof Pet); - expectTrue(owner.getPet() instanceof DogProxy); //even though it is not a dog it still should implement the interface owner = entityManager.find(PetOwner.class, 2); expectEquals("Sanne", owner.getName()); expectEquals("Meow", owner.getPet().makeNoise()); - DogProxy dogProxy = (DogProxy) owner.getPet(); - try { - dogProxy.bark(); - throw new RuntimeException("Should have failed as not a dog"); - } catch (ClassCastException e) { - - } - expectFalse(owner.getPet() instanceof Pet); - owner = entityManager.find(PetOwner.class, 3); expectEquals("Emmanuel", owner.getName()); expectEquals("Woof", owner.getPet().makeNoise()); - expectEquals("Woof", ((DogProxy) owner.getPet()).bark()); - expectEquals("Rubber Bone", ((DogProxy) owner.getPet()).getFavoriteToy()); - expectFalse(owner.getPet() instanceof Pet); - expectTrue(owner.getPet() instanceof DogProxy); + var unproxied = Hibernate.unproxy(owner.getPet()); + expectTrue(unproxied instanceof Dog); + expectEquals("Woof", ((Dog) unproxied).bark()); + expectEquals("Rubber Bone", ((Dog) unproxied).getFavoriteToy()); return "OK"; } diff --git a/pom.xml b/pom.xml index a32db0d85e60f..d99c0d16b003e 100644 --- a/pom.xml +++ b/pom.xml @@ -71,13 +71,13 @@ 0.8.12 6.13.4 5.5.0 - 6.6.1.Final + 7.0.0.Beta1 4.13.0 1.14.18 - 7.0.1.Final 2.4.2.Final 8.0.1.Final - 7.2.1.Final + 7.2.1.Final + 7.0.1.Final 1.65.1