Add AbstractEntityManagerFactoryBean proxy hints for Hibernate
Closes gh-29138
This commit is contained in:
		
							parent
							
								
									948c9b85a0
								
							
						
					
					
						commit
						198e17f659
					
				|  | @ -0,0 +1,44 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright 2002-2022 the original author or authors. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.springframework.orm.jpa; | ||||||
|  | 
 | ||||||
|  | import org.springframework.aot.hint.RuntimeHints; | ||||||
|  | import org.springframework.aot.hint.RuntimeHintsRegistrar; | ||||||
|  | import org.springframework.aot.hint.TypeReference; | ||||||
|  | import org.springframework.util.ClassUtils; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * {@link RuntimeHintsRegistrar} implementation that makes sure JDK proxy hints related to | ||||||
|  |  * {@link AbstractEntityManagerFactoryBean} are registered. | ||||||
|  |  * | ||||||
|  |  * @author Sebastien Deleuze | ||||||
|  |  * @since 6.0 | ||||||
|  |  */ | ||||||
|  | class EntityManagerRuntimeHints implements RuntimeHintsRegistrar { | ||||||
|  | 
 | ||||||
|  | 	private static final String HIBERNATE_SESSION_FACTORY_CLASS_NAME = "org.hibernate.SessionFactory"; | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void registerHints(RuntimeHints hints, ClassLoader classLoader) { | ||||||
|  | 		if (ClassUtils.isPresent(HIBERNATE_SESSION_FACTORY_CLASS_NAME, classLoader)) { | ||||||
|  | 			hints.proxies().registerJdkProxy(TypeReference.of(HIBERNATE_SESSION_FACTORY_CLASS_NAME), | ||||||
|  | 					TypeReference.of(EntityManagerFactoryInfo.class)); | ||||||
|  | 			hints.proxies().registerJdkProxy(TypeReference.of("org.hibernate.Session"), | ||||||
|  | 					TypeReference.of(EntityManagerProxy.class)); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -1,2 +1,5 @@ | ||||||
| org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=\ | org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=\ | ||||||
| org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypesBeanRegistrationAotProcessor | org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypesBeanRegistrationAotProcessor | ||||||
|  | 
 | ||||||
|  | org.springframework.aot.hint.RuntimeHintsRegistrar=\ | ||||||
|  | org.springframework.orm.jpa.EntityManagerRuntimeHints | ||||||
|  |  | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright 2002-2022 the original author or authors. | ||||||
|  |  * | ||||||
|  |  * Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  |  * you may not use this file except in compliance with the License. | ||||||
|  |  * You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.springframework.orm.jpa; | ||||||
|  | 
 | ||||||
|  | import org.hibernate.Session; | ||||||
|  | import org.hibernate.SessionFactory; | ||||||
|  | import org.junit.jupiter.api.BeforeEach; | ||||||
|  | import org.junit.jupiter.api.Test; | ||||||
|  | 
 | ||||||
|  | import org.springframework.aot.hint.RuntimeHints; | ||||||
|  | import org.springframework.aot.hint.RuntimeHintsRegistrar; | ||||||
|  | import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; | ||||||
|  | import org.springframework.beans.factory.aot.AotServices; | ||||||
|  | import org.springframework.util.ClassUtils; | ||||||
|  | 
 | ||||||
|  | import static org.assertj.core.api.Assertions.assertThat; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Tests for {@link EntityManagerRuntimeHints}. | ||||||
|  |  * | ||||||
|  |  * @author Sebastien Deleuze | ||||||
|  |  */ | ||||||
|  | class EntityManagerRuntimeHintsTests { | ||||||
|  | 
 | ||||||
|  | 	private final RuntimeHints hints = new RuntimeHints(); | ||||||
|  | 
 | ||||||
|  | 	@BeforeEach | ||||||
|  | 	void setup() { | ||||||
|  | 		AotServices.factories().load(RuntimeHintsRegistrar.class) | ||||||
|  | 				.forEach(registrar -> registrar.registerHints(this.hints, | ||||||
|  | 						ClassUtils.getDefaultClassLoader())); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Test | ||||||
|  | 	void entityManagerFactoryInfoHasHibernateHints() { | ||||||
|  | 		assertThat(RuntimeHintsPredicates.proxies().forInterfaces(SessionFactory.class, EntityManagerFactoryInfo.class)) | ||||||
|  | 				.accepts(this.hints); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Test | ||||||
|  | 	void entityManagerProxyHasHibernateHints() { | ||||||
|  | 		assertThat(RuntimeHintsPredicates.proxies().forInterfaces(Session.class, EntityManagerProxy.class)) | ||||||
|  | 				.accepts(this.hints); | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue