EntityManagerFactory
是 Java Persistence API (JPA) 中的一个关键接口,用于创建 EntityManager
实例。EntityManager
是 JPA 的主要接口,用于与持久化上下文进行交互。当涉及到多数据源时,配置和管理多个 EntityManagerFactory
实例变得尤为重要。
EntityManager
实例。在 Spring Boot 中配置多数据源通常涉及以下步骤:
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
EntityManagerFactory
:@Configuration
@EnableJpaRepositories(
basePackages = "com.example.primary.repositories",
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager"
)
public class PrimaryDataSourceConfig {
@Primary
@Bean
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.primary.entities")
.persistenceUnit("primary")
.build();
}
@Primary
@Bean
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.secondary.repositories",
entityManagerFactoryRef = "secondaryEntityManagerFactory",
transactionManagerRef = "secondaryTransactionManager"
)
public class SecondaryDataSourceConfig {
@Bean
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.secondary.entities")
.persistenceUnit("secondary")
.build();
}
@Bean
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
@Transactional
注解时需要指定事务管理器。假设我们有两个数据源,分别对应两个不同的数据库,以下是如何在 Spring Boot 中配置和使用它们的示例:
@SpringBootApplication
public class MultiDataSourceApplication {
public static void main(String[] args) {
SpringApplication.run(MultiDataSourceApplication.class, args);
}
}
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getters and setters
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional("primaryTransactionManager")
public User saveUser(User user) {
return userRepository.save(user);
}
}
通过上述配置和代码,可以有效地管理和使用多个数据源,确保应用程序的灵活性和可扩展性。
云+社区沙龙online [国产数据库]
微搭低代码直播互动专栏
算力即生产力系列直播
开箱吧腾讯云
云+社区沙龙online [国产数据库]
云+社区沙龙online[数据工匠]
一体化监控解决方案
实战低代码公开课直播专栏
数字化产业研学汇第三期
领取专属 10元无门槛券
手把手带您无忧上云