当我想在两个数据库之间工作时遇到了一个问题,我想使用数据库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!!!!!救命啊!!!!!啊!
最佳答案
要能够使用多个数据源,您需要具有多个持久单元配置。
我假设您需要配置datasourceA
和datasourceB
。
对于每个持久单元,我们都有一个配置类。列表包含datasourceA
的类(您必须复制并调整datasourceB
的配置)。
最好不要混合来自不同持久单元的实体。
所以我们根据包裹把它们分开了。我们创建了一个空类SpringRootPackageMarker
以便它告诉spring要扫描哪些包。
注意!SpringRootPackageMarker
类用于@EnableJpaRepositories
和getDatasourceAEntityManagerFactoryBean
方法
所以这就是我们的方法:
@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;