gpt4 book ai didi

mysql - 在 Spring Boot 中使用多个数据库

转载 作者:搜寻专家 更新时间:2023-10-30 20:52:55 25 4
gpt4 key购买 nike

我想在两个数据库之间工作时遇到了一个问题,我想使用数据库1中的表1和数据库2中的表2,我尝试了很多方法,但似乎都行不通。

spring.datasource.primary.url = jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8
spring.datasource.primary.username = root
spring.datasource.primary.password = xxxx
spring.datasource.primary.driverClassName=com.mysql.jdbc.Driver

spring.datasource.secondary.url = jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=UTF-8
spring.datasource.secondary.username = root
spring.datasource.secondary.password = xxxx
spring.datasource.secondary.driverClassName=com.mysql.jdbc.Driver

上面是我的application.properties。然后我在配置文件中使用 @Primary 设置 spring.datasource.primary 作为主数据库。

@Entity
@Table(name = "User")
public class User {
@Id
@NotNull
@Column(name = "phoneid")
private String phoneid;
}
public interface UserDAO extends CrudRepository<User, String> {
public User findByPhoneid(String phoneid);
}

我想连接到数据库 spring.datasource.primary 并使用其中的表 User。

@Entity
@Table(name = "Favorite_Restaurant")
public class FavoriteRestaurant {
@Id
@NotNull
@Column(name = "favorite_restaurantid")
private int favoriteRestaurantId;
}
public interface FavoriteRestaurantDAO extends JpaRepository<FavoriteRestaurant, Integer> {

public List<FavoriteRestaurant> findAll(Sort sort);
}

我想连接到数据库 spring.datasource.secondary 并使用其中的表 FavoriteRestaurant。

但是,当我在我的服务中 Autowiring UserDAo 和 FavoriteRestaurantDAO 时,它似乎从主数据库 Autowiring 了 userdao 和 favoritestaurantdao。我如何从辅助数据库中注入(inject) FavoriteRestaurantDAO!!!!!帮助!!!!!!

最佳答案

为了能够使用多个数据源,您需要有多个持久单元配置。

我假设您已经配置了 datasourceAdatasourceB

我们的每个持久化单元都有一个配置类。该 list 包含 datasourceA 的类(您必须复制并调整 datasourceB 的配置)。

最好不要混合来自不同持久单元的实体。所以我们根据包把它们分开了。我们创建了一个空类SpringRootPackageMarker 以便它告诉 spring 要扫描哪些包。

注意! SpringRootPackageMarker 类在 @EnableJpaRepositoriesgetDatasourceAEntityManagerFactoryBean 方法中使用

所以这是我们的方法:

@DependsOn("transactionManager")
@EnableJpaRepositories(
basePackageClasses = SpringRootPackageMarker.class,
entityManagerFactoryRef = "datasourceAEntityManager",
transactionManagerRef = "transactionManager")
public class DatasourceAPersistenceUnitConfiguration {


private static final String DATASOURCE_A_PERSISTENT_UNIT_NAME = "datasourceAPU";


@DependsOn("transactionManager") // for unit tests
@Bean(name = "datasourceAEntityManager")
public LocalContainerEntityManagerFactoryBean getDatasourceAEntityManagerFactoryBean() {
final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setPersistenceUnitName(DATASOURCE_A_PERSISTENT_UNIT_NAME);
factory.setDataSource(getDatasourceA());
factory.setJpaVendorAdapter(getDatasourceAJpaVendorAdapter());
factory.setPackagesToScan(SpringRootPackageMarker.class.getPackage().getName());
Properties jpaProperties = getDatasourceAJpaProperties();
factory.setJpaProperties(jpaProperties);
return factory;
}

@Bean
public DataSource getDatasourceA() {

DataSource datasource = null;
// prepare datasource A;

return datasource;
}


private JpaVendorAdapter getDatasourceAJpaVendorAdapter() {
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

//custom configuration for datasource A

return vendorAdapter;
}


private Properties getDatasourceAJpaProperties() {
Properties jpaProperties = new Properties();

//custom properties

return jpaProperties;
}
}

}

如果您打算将 entityManager 注入(inject)到您的应用程序中,您必须这样做:

@PersistenceContext(unitName= DatasourceAPersistenceUnitConfiguration.DATASOURCE_A_PERSISTENT_UNIT_NAME)
private EntityManager manager;

关于mysql - 在 Spring Boot 中使用多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com