我有一个使用 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);
}
}
对我有用的方法是:
我为我希望应用程序连接的每个数据库/用户创建了一个文件夹。例如,如果您想连接到 2 个数据库(db1、db2),我创建了 2 个文件夹 db1 和 db2。
在这些文件夹中,我创建了一个 Entity 文件夹(其中放置了与数据库实体对应的内容)、一个 Repository 文件夹、一个 Service 文件夹和一个 Config 文件夹。
在 Config 文件夹中,我创建了 DB1_Config.java 文件(对于 db1 为 DB1_Config,对于 db2 为 DB2_Config)
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。我认为主要问题是您必须根据不同的数据库对您的类进行分组,或者如果您位于不同模式用户的同一数据库上。