Spring Boot中JPA EntityManagerFactory自动关闭问题求助
问题描述
学习Spring Boot的JDBC与JPA内容时,运行测试出现JPA EntityManagerFactory自动关闭的情况,无法继续学习。以下是项目的pom.xml配置及控制台输出:
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>JPAandHybernate</groupId> <artifactId>Learn-JAP-and-hybernate</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Learn-JAP-and-hybernate</name> <description>Demo project for Spring Boot</description> <properties> <java.version>22</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
控制台输出
09:44:49.895 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [JPAandHybernate.LearnJAPandhybernate.LearnJapAndHybernateApplicationTests]: LearnJapAndHybernateApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration. 09:44:50.034 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration JPAandHybernate.LearnJAPandhybernate.LearnJapAndHybernateApplication for test class JPAandHybernate.LearnJAPandhybernate.LearnJapAndHybernateApplicationTests . ____ _ __ _ _ /\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.4) 2024-04-20T09:44:50.934+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] J.L.LearnJapAndHybernateApplicationTests : Starting LearnJapAndHybernateApplicationTests using Java 22 with PID 71832 (started by harsha.umashankar in C:\Users\harsha.umashankar\Downloads\Learn-JAP-and-hybernate\Learn-JAP-and-hybernate) 2024-04-20T09:44:50.937+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] J.L.LearnJapAndHybernateApplicationTests : No active profile set, falling back to 1 default profile: "default" 2024-04-20T09:44:52.291+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2024-04-20T09:44:52.294+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JDBC repositories in DEFAULT mode. 2024-04-20T09:44:52.325+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 22 ms. Found 0 JDBC repository interfaces. 2024-04-20T09:44:52.351+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode 2024-04-20T09:44:52.353+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2024-04-20T09:44:52.364+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 4 ms. Found 0 JPA repository interfaces. 2024-04-20T09:44:53.124+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2024-04-20T09:44:53.375+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:e71046aa-9390-404f-ac0f-f9c82623e8b7 user=SA 2024-04-20T09:44:53.378+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. 2024-04-20T09:44:53.461+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2024-04-20T09:44:53.560+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.4.4.Final 2024-04-20T09:44:53.611+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] o.h.c.internal.RegionFactoryInitiator : HHH000026: Second-level cache disabled 2024-04-20T09:44:54.021+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer 2024-04-20T09:44:54.671+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) 2024-04-20T09:44:54.678+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2024-04-20T09:44:54.979+05:30 WARN 71832 --- [Learn-JAP-and-hybernate] [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2024-04-20T09:44:55.902+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:e71046aa-9390-404f-ac0f-f9c82623e8b7' 2024-04-20T09:44:56.008+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ main] J.L.LearnJapAndHybernateApplicationTests : Started LearnJapAndHybernateApplicationTests in 5.714 seconds (process running for 7.321) WARNING: A Java agent has been loaded dynamically (C:\MyRepoHarsha\net\bytebuddy\byte-buddy-agent\1.14.12\byte-buddy-agent-1.14.12.jar) WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information WARNING: Dynamic loading of agents will be disallowed by default in a future release Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended 2024-04-20T09:44:57.212+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default' 2024-04-20T09:44:57.217+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... 2024-04-20T09:44:57.221+05:30 INFO 71832 --- [Learn-JAP-and-hybernate] [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
解决方法
从控制台日志可以看出,测试类启动Spring容器后没有执行任何测试方法,导致容器启动完成后直接关闭,EntityManagerFactory和连接池也随之关闭。另外项目同时引入了spring-boot-starter-data-jdbc和spring-boot-starter-data-jpa,初学阶段建议分开学习,避免混淆。
步骤1:给测试类添加测试方法
打开LearnJapAndHybernateApplicationTests类,添加至少一个带@Test注解的测试方法,示例如下:
import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class LearnJapAndHybernateApplicationTests { @Test void contextLoads() { // 空方法即可,用于保持容器运行 } // 可在此添加实际要测试的JPA/JDBC逻辑代码 }
添加后测试运行时会执行该方法,容器会保持到测试方法执行完毕才关闭,你可以正常进行调试或操作。
步骤2:(可选)移除不必要的依赖
如果当前仅学习JPA,可暂时移除spring-boot-starter-data-jdbc依赖,避免Spring Data多模块的冲突提示:
<!-- 暂时注释或删除JDBC starter --> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> -->
步骤3:如需长期保持容器运行(如测试H2控制台)
如果想启动后保持容器运行,方便访问H2控制台或调试,可在测试类上添加@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT),或者直接启动主应用类LearnJapAndHybernateApplication而非测试类。
内容的提问来源于stack exchange,提问作者HARSHA U
相关产品推荐
相关产品推荐

