我正在开发2个Spring项目,一个Web应用程序和一个独立的后端服务。两者都使用Hibernate和相同的底层数据库。由于这两个项目都使用了他们自己的大多数服务和存储库类的副本,我有很多重复的代码,这总是成为我自己管理超过47 000行代码的噩梦。因此,我决定创建一个我实际上用作类库的第三个项目。它存储实体类,服务类和存储库类,并将其作为Maven依赖项添加到每个项目中。在我做出这一重大改变之前,一切都完美无瑕。
网络应用程序运行良好,但服务根本无法启动。这是堆栈跟踪:
Exception in thread "Test Legacy Orders Server Init Thread" Exception in thread "Test Legacy Formulary Server Init Thread" org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is java.lang.IllegalStateException: EntityManagerFactory is closed
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:564)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:378)
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:289)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy79.logInfo(Unknown Source)
at com.mdenis.mdhis_service.connectivity.HL7TestServer.start(HL7TestServer.java:69)
at com.mdenis.mdhis_service.core.MDHIS_Service$7.run(MDHIS_Service.java:311)
Caused by: java.lang.IllegalStateException: EntityManagerFactory is closed
at org.hibernate.internal.SessionFactoryImpl.validateNotClosed(SessionFactoryImpl.java:498)
at org.hibernate.internal.SessionFactoryImpl.getCache(SessionFactoryImpl.java:769)
at org.hibernate.internal.AbstractSharedSessionContract.<init>(AbstractSharedSessionContract.java:142)
at org.hibernate.internal.AbstractSessionImpl.<init>(AbstractSessionImpl.java:29)
at org.hibernate.internal.SessionImpl.<init>(SessionImpl.java:252)
at org.hibernate.internal.SessionFactoryImpl$SessionBuilderImpl.openSession(SessionFactoryImpl.java:1229)
at org.hibernate.internal.SessionFactoryImpl.openSession(SessionFactoryImpl.java:449)
at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:456)
... 9 more
我在HibernateUtil类中唯一改变的就是这一行:
sessionFactory.setPackagesToScan(new String[] {"com.mdenis.mdhis_common.entity"});
这是包含共享jar文件中的实体的新包。我知道Hibernate正在使用新设置正确初始化,因为有很多事务从这个服务成功通过数据库。我注意到的一件事是主线程看起来很好。这个应用程序是多线程的,只有子线程似乎遇到了这个问题。
在我进行大规模重构之前,每个项目都有自己的本地@Transactional服务类来处理,一切都运行良好。我不允许的是什么?有没有办法让2个项目使用相同的@Transactional服务?
谢谢!
答案 0 :(得分:0)