当我想在两个数据库之间工作时遇到了一个问题,我想使用数据库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

上面是我的应用程序.properties。然后我使用@primary setting 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);
}

我想连接到database 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并在其中使用表favoritestaurant。
然而,当我在我的服务中自动连接userdao和favoriterestaurantdao时,它看起来就像是从主数据库自动连接userdao和favoriterestaurantdao一样。如何从二级数据库中注入FavoriteRestaurantDAO!!!!!救命啊!!!!!啊!

最佳答案

要能够使用多个数据源,您需要具有多个持久单元配置。
我假设您需要配置datasourceAdatasourceB
对于每个持久单元,我们都有一个配置类。列表包含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注入应用程序,则必须这样做:
@PersistenceContext(unitName= DatasourceAPersistenceUnitConfiguration.DATASOURCE_A_PERSISTENT_UNIT_NAME)
private EntityManager manager;

10-04 10:12
查看更多