首页 > 解决方案 > Spring JPA 抛出 java.lang.IllegalArgumentException:对于从依赖项 jar 加载的类来说不是托管类型异常

问题描述

我正在使用 springmvc+jpa (No spring-boot) 代码库,我们将一些实体类打包在一个带有相应 hbm 映射文件的 jar 中,并作为依赖项添加到当前项目中,我们有两个事务管理器,一个是基于 Hibernate (它可以正常工作)另一个是基于 jpa entityManager,我正在配置如下

@Configuration
@EnableJpaRepositories( basePackages = "<repopackage>", bootstrapMode = BootstrapMode.LAZY)
public class DataSourceConfig {
    
    @Bean(name = "entityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(DataSource dataSource,
            MultiTenantConnectionProvider multiTenantConnectionProvider,
            CurrentTenantIdentifierResolver currentTenantIdentifierResolver) {
        
        Map<String, Object> props = new HashMap<String, Object>();
        props.put(Environment.MULTI_TENANT , "DATABASE");
        props.put(Environment.MULTI_TENANT_IDENTIFIER_RESOLVER,currentTenantIdentifierResolver);
        props.put(Environment.MULTI_TENANT_CONNECTION_PROVIDER, multiTenantConnectionProvider);
        props.put(Environment.DIALECT, "com.custom.PostgreSQLDialect");
        props.put(Environment.SCANNER_DISCOVERY, "class, hbm");
        props.put(Environment.ENABLE_LAZY_LOAD_NO_TRANS, "true");
        props.put(Environment.SHOW_SQL, "true");
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setPackagesToScan(new String[] { "<domain package in current project>", "domain package in dependency jar" });
        HibernateJpaVendorAdapter apt = new HibernateJpaVendorAdapter();
        entityManagerFactory.setDataSource(dataSource);
        entityManagerFactory.setJpaVendorAdapter(apt);
        entityManagerFactory.setJpaPropertyMap(props);
        return entityManagerFactory; 
    }

    @Bean(name="transactionManager") 
    JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }
}

该配置适用于当前项目中带有注释的实体类,我可以创建实现JpaRepository接口并能够访问它的存储库。现在,当我为依赖项 jar 中存在的域对象创建存储库时,我得到了这个异常

Request processing failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;resourceDetailRepository&#39;: 
FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.ResourceDetail
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:890)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875)

标签: hibernatespring-mvcjpaspring-data-jpa

解决方案


推荐阅读