我不确定这是否是最好的解决方案。但是,它对我有用。
如果您有两个使用的关系数据库Jpa
模块,那么我建议你创建entity
and transaction
管理器 bean 来读取每个数据源配置。有关上述用例,请参阅以下链接。
springboot总是从主数据源读取数据 https://stackoverflow.com/questions/41077095/springboot-always-read-data-from-primary-datasource
正如您希望拥有的组合SQL
and NoSQL
,我会创建entity
and transcation
经理豆MySQL
数据库,因为它可以很好地配合Jpa
。并保留原样配置Mongo
(配置直接读取application.properties
).
MySQLConfiguration
数据源配置类:
@Configuration
@PropertySource("classpath:persistence-multiple-db.properties")
@EnableJpaRepositories(basePackages = "com.springdata.dao.mysql", entityManagerFactoryRef = "mysqlEntityManager", transactionManagerRef = "mysqlTransactionManager")
public class MySQLConfiguration {
@Autowired
private Environment env;
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean mysqlEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(myMySQLDataSource());
em.setPackagesToScan(new String[] { "com.springdata.models" });
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<String, Object>();
properties.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
em.setJpaPropertyMap(properties);
return em;
}
@Bean
@Primary
public DataSource myMySQLDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.mysql.jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("spring.mysql.jdbc.url"));
dataSource.setUsername(env.getProperty("spring.mysql.user"));
dataSource.setPassword(env.getProperty("spring.mysql.pass"));
return dataSource;
}
@Bean
@Primary
public PlatformTransactionManager mysqlTransactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(mysqlEntityManager().getObject());
return transactionManager;
}
上面的数据源配置参数是从classpath:persistence-multiple-db.properties
类路径中的文件。
# mysql jdbc connections
spring.mysql.jdbc.driverClassName=com.mysql.jdbc.Driver
spring.mysql.jdbc.url=jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false
spring.mysql.user=root
spring.mysql.pass=password1
# hibernate.X
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
上面的配置,应该足够应付了MySQL
数据源。要在项目中进行 mongo 配置,请将以下行添加到application.properties
.
# mongo configuration
spring.data.mongodb.uri=mongodb://localhost
spring.data.mongodb.database=test
Springboot 将自动创建必要的 mongo 数据源 bean,并让它们随时可供 spring 容器使用。
现在,为 MySQL 和 Mongo 数据源创建存储库接口。
MyMongoRepository
界面:
@Transactional
public interface MyMongoRepository extends MongoRepository<Users, String>{
}
MySQLRepository
界面:
@Transactional
public interface MySQLRepository extends JpaRepository<Users, String>{
}
Users
波乔类:
@Entity
@Table(name = "users")
@Document(collection="users")
@Data
public class Users {
@Id
@javax.persistence.Id
private String id;
private String name;
private Integer age;
}
添加了以下注释以启用 mongorepository 并将组件扫描到 Spring Boot 主类。
@SpringBootApplication
@ComponentScan(basePackages = { "com.springdata" })
@EnableMongoRepositories(basePackages={"com.springdata.dao.mongo"})
public class SpringbootmysqlmongoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootmysqlmongoApplication.class, args);
}
}
最后,一些要测试的代码。
MyRepositoryImpl
class:
@Service
public class MyRepositoryImpl {
@Autowired
private MyMongoRepository myMongoRepository;
@Autowired
private MySQLRepository mySQLRepository;
@PostConstruct
public void extractUsers(){
myMongoRepository.findAll().forEach((user) -> System.out.println("user name from mongo is : "+user.getName()));
mySQLRepository.findAll().forEach((user) -> System.out.println("User name from mysql is : "+user.getName()));
}
}
已经创造出来了users
表中mysql test
数据库和users
收集于mongo test
数据库。
最后,将我的代码上传到 git 存储库。
https://github.com/harshavmb/springbootmysqlmongo https://github.com/harshavmb/springbootmysqlmongo