- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Spring Boot Data JPA 和 Tomcat Starters,
我有一个应用程序,在多个 Maven 模块中定义了多个持久性单元,这些模块在独立使用时可以正常工作:
Project
-- IdentityAccess [PU name: identity-access]
|--- src/main/java
|--- myapp.application [Application services using "identityAccessTransactionManager"]
|--- myapp.domain.model [Entites classes]
|--- myapp.infrastructure.persistence [Repositories Impl using nested DataJpa repositories]
|--- src/main/resources
|--- myapp/application.properties
|--- myapp/hibernate.cfg.xml
|--- myapp/infrastructure/persistence/Group.hbm.xml
|--- myapp/infrastructure/persistence/GroupMember.hbm.xml
|--- myapp/infrastructure/persistence/User.hbm.xml
-- Promotion [PU name: promotion]
...
-- WebApplication [There is no PU here]
-> Depends on IdentityAccess, Promotion
@SpringBootApplication
@Import({IdentityAccessContext.class, PromotionContext.class})
以下是我如何在每个 PU 中配置我的 EntityManagerFactoryBean,为它们提供唯一的 bean 名称以避免冲突。 注意:以下Configuration是每个模块中包含的一个类
@Configuration
@ComponentScan
@EnableJpaRepositories(
transactionManagerRef = TRANSACTION_MANAGER,
entityManagerFactoryRef = ENTITY_MANAGER_FACTORY,
considerNestedRepositories = true)
public class IdentityAccessPersistenceConfiguration {
public static final String PERSISTENCE_CONTEXT = "identity-access";
public static final String ENTITY_MANAGER_FACTORY = "identityAccessEntityManagerFactory";
public static final String TRANSACTION_MANAGER = "identityAccessTransactionManager";
@Bean
public LocalContainerEntityManagerFactoryBean identityAccessEntityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource);
entityManagerFactory.setJpaVendorAdapter(jpaVendorAdapter);
entityManagerFactory.setMappingResources("myapp/identityaccess/hibernate.cfg.xml");
entityManagerFactory.setPersistenceUnitName("identity-access");
return entityManagerFactory;
}
@Bean
public PlatformTransactionManager identityAccessTransactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
}
当我单独启动每个模块时,即在测试上下文中以及作为独立应用程序时,实体被正确加载和映射,PersistenceUnitInfoDescriptor 有一个根 URL,如下所示:
file:/F:/Workspaces/myapp/IdentityAccess/target/classes/
但是当我启动 web-app 时,每个 PU 都带有另一个根 URL,这是 web-app 上下文的根,因此它无法加载映射类:
file:/F:/Workspaces/myapp/WebApplication/target/WebApplication-1.0.0-SNAPSHOT/WEB-INF/classes/
它不应该是包含 PU 的 jar 吗?我试图 Hook setPersistenceUnitRootLocation 来放置我的 jar URL,但我被卡住了,因为版本和路径显然可以改变。我什至不知道这是一个错误还是我在做一些不受支持的事情。也许这个错误甚至不属于 Spring Boot 而属于 Spring 本身。
我觉得我触及了太多的内部结构,这就是为什么我认为它是一个错误,但如果不是,请纠正我,我已经在 spring boot github 上打开了一张具有相同描述的票。
我还看了: - https://github.com/spring-projects/spring-boot/issues/6983 - https://github.com/spring-projects/spring-boot/issues/6635 - https://github.com/spring-projects/spring-boot/issues/7003 - https://github.com/spring-projects/spring-boot/issues/7021
这似乎是相关的。
谢谢你的时间,
最佳答案
我解决了这个问题:
在 org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration 中,该方法假定持久化单元在应用程序本身中:
private URL determinePersistenceUnitRootLocation() {
Class<?> source = getClass();
try {
URL url = source.getProtectionDomain().getCodeSource().getLocation();
return ResourceUtils.extractJarFileURL(url);
}
catch (Exception ex) {
logger.info("Could not determine persistence " + "unit root location from "
+ source + " : " + ex);
}
return null;
}
源属于主webapp,所以类加载器放错了路径文件。
要解决我的问题,需要使用 jar 中的配置类在我的配置文件中使用相同的方法设置 RootPersistenceUnitRootLocation,并且该单元已从 JAR 中正确加载。
问题是:spring boot autoconfigure 应该改用持久性单元中的类,还是使用 setJarUrl 来包含适当的修复?还是仅支持一个主要持久性单元是一个坚定的选择?我认为自动配置并允许开箱即用的多个持久性单元(来自不同的 jar)会很棒,尤其是对于域驱动设计架构。
关于java - 在 web 应用上下文中导入时,在 jar 文件中配置的 PersistenceUnit 具有错误的 PersistenceUnitRootLocation URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40455892/
我是一名优秀的程序员,十分优秀!