diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java index 48771feeb32c..5730a3ce8992 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java @@ -1836,6 +1836,11 @@ private void processFkSecondPassesInOrder() { if ( sp.isInPrimaryKey() ) { final String referenceEntityName = sp.getReferencedEntityName(); final PersistentClass classMapping = getEntityBinding( referenceEntityName ); + if ( classMapping == null ) { + throw new HibernateException( + "Primary key referenced an unknown entity : " + referenceEntityName + ); + } final String dependentTable = classMapping.getTable().getQualifiedTableName().render(); if ( !isADependencyOf.containsKey( dependentTable ) ) { isADependencyOf.put( dependentTable, new HashSet<>() ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/BootFailureTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/BootFailureTest.java index ad1d6e1fbfca..d13d3de10f37 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/BootFailureTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/BootFailureTest.java @@ -11,16 +11,19 @@ import java.util.HashMap; import java.util.List; import java.util.Map; + import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.Persistence; +import org.hibernate.HibernateException; import org.hibernate.cfg.AvailableSettings; import org.hibernate.service.spi.ServiceException; import org.hibernate.testing.boot.ClassLoaderServiceTestingImpl; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertThrows; + /** * Test to verify that a dump configuration error results in an exception being * thrown even when booting via the standard JPA boostrap API. @@ -32,16 +35,24 @@ public class BootFailureTest { @Test public void exceptionOnIllegalPUTest() { - Assertions.assertThrows( ServiceException.class, () -> + assertThrows( ServiceException.class, () -> bootstrapPersistenceUnit( "IntentionallyBroken" ) ); } @Test public void exceptionOnIllegalPUWithoutProviderTest() { - Assertions.assertThrows( ServiceException.class, () -> + assertThrows( ServiceException.class, () -> bootstrapPersistenceUnit( "IntentionallyBrokenWihoutExplicitProvider" ) ); } + @Test + public void missingClassPUTest() { + assertThrows( HibernateException.class, () -> + bootstrapPersistenceUnit( "IntentionallyMissingClass" ), + "A HibernateException due to a missing class in the persistence.xml should have been thrown" + ); + } + private void bootstrapPersistenceUnit(final String puName) { final Map properties = new HashMap<>(); properties.put( AvailableSettings.CLASSLOADERS, Arrays.asList( new TestClassLoader() ) ); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/Event.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/Event.java new file mode 100644 index 000000000000..65ba8dd9aa1d --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/Event.java @@ -0,0 +1,28 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.jpa.boot; + + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; + +/** +* @author Jan Schatteman +*/ +@Entity(name = "Event") +public class Event { + @Id + @OneToOne + private EventId id; + + public EventId getId() { + return id; + } + + public void setId(EventId id) { + this.id = id; + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/EventId.java b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/EventId.java new file mode 100644 index 000000000000..a69d1db91976 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/jpa/boot/EventId.java @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.jpa.boot; + + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; + +/** +* @author Jan Schatteman +*/ +@Entity(name = "EventId") +public class EventId { + + @Id + @GeneratedValue + private Long id; + +} diff --git a/hibernate-core/src/test/resources/org/hibernate/orm/test/jpa/boot/META-INF/persistence.xml b/hibernate-core/src/test/resources/org/hibernate/orm/test/jpa/boot/META-INF/persistence.xml index 5d2c2bd7be36..ef1a152079c4 100644 --- a/hibernate-core/src/test/resources/org/hibernate/orm/test/jpa/boot/META-INF/persistence.xml +++ b/hibernate-core/src/test/resources/org/hibernate/orm/test/jpa/boot/META-INF/persistence.xml @@ -25,4 +25,9 @@ + + org.hibernate.jpa.HibernatePersistenceProvider + org.hibernate.orm.test.jpa.boot.Event + +