entityManagerFactory 定义后实体自动创建不起作用

问题描述 投票:0回答:1

我有一个使用 Spring -Jpa 的工作代码。最近我有一个要求,我必须添加多个数据源,并且为此我必须定义entityManagerFactory(下面给出的代码)。由于我添加此实体(表)时不会自动创建或无法被应用程序识别。我的项目正在使用 Spring 父版本 2.7.13 。我用较新版本的 Spring(3.1.3)尝试过,效果很好。有人可以帮我解决问题是什么以及我缺少什么吗?我已经验证了这些包,一切都很好。此外,在添加这个新类之前,它运行良好。

@Configuration
public class DataSourceConfig {

    // Primary datasource configuration

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.demo.model") // base package for your JPA entities
                .persistenceUnit("primary")
                .build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }

    // Secondary Datasource 1 Configuration

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.ds1")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondaryJdbcTemplate")
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    // Secondary Datasource 2 Configuration

    @Bean(name = "thirdDataSource")
    @ConfigurationProperties(prefix = "spring.ds2")
    public DataSource thirdDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "thirdJdbcTemplate")
    public JdbcTemplate thirdJdbcTemplate(@Qualifier("thirdDataSource") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}
spring-data-jpa spring-data
1个回答
0
投票

对我有用的方法是:

  1. 我为我希望应用程序连接的每个数据库/用户创建了一个文件夹。例如,如果您想连接到 2 个数据库(db1、db2),我创建了 2 个文件夹 db1 和 db2。

  2. 在这些文件夹中,我创建了一个 Entity 文件夹(其中放置了与数据库实体对应的内容)、一个 Repository 文件夹、一个 Service 文件夹和一个 Config 文件夹。

  3. 在 Config 文件夹中,我创建了 DB1_Config.java 文件(对于 db1 为 DB1_Config,对于 db2 为 DB2_Config)

  4. DB1_Config.java 文件看起来像这样

    @Configuration
    @EnableTransactionManagement
    @EnableJpaRepositories(
         entityManagerFactoryRef = "DB1userEntityManagerFactory",
         transactionManagerRef = "DB1userTransactionManager",
         basePackages = {
             "com.DataBase.DB1.user.Repository" //put the actual path to your Repository folder
         }
    
    )
    public class DB1_Config{
    
     static final String JNDI = "jdbc/DB1user"; //your actual jndi name
    
     @Bean(name = "DB1userDataSource", destroyMethod = "")
     @ConfigurationProperties(prefix = "DB1user.datasource")
     public DataSource dataSource() throws DataSourceLookupFailureException {
         JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
         return dataSourceLookup.getDataSource(JNDI);
     }
    
     @Bean(name = "DB1userEntityManagerFactory")
     public LocalContainerEntityManagerFactoryBean
             entityManagerFactory(
                     EntityManagerFactoryBuilder builder,
                     @Qualifier("DB1userDataSource") DataSource dataSource) {
         return builder.dataSource(dataSource).packages("com.DataBase.DB1.user.Entity").persistenceUnit("db1user").build();
     } //in com.DataBase.DB1.user.Entity put your actual Entity path
    
     @Bean(name = "DB1userTransactionManager")
     public PlatformTransactionManager entityTransactionManager(
             @Qualifier("DB1userEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
         return new JpaTransactionManager(entityManagerFactory);
     }
    }
    

和 DB2_Config 相同,但是无论它在哪里写 DB1,你就在哪里写 DB2。我认为主要问题是您必须根据不同的数据库对您的类进行分组,或者如果您位于不同模式用户的同一数据库上

© www.soinside.com 2019 - 2024. All rights reserved.