Java Micronaut只能使用一个数据库,甚至可以连接两个数据库
我已经用两个MySQL数据库配置了Micronaut应用程序,但它总是使用默认数据源执行操作 如何处理多个数据库 以下是我的application.yml配置:Java Micronaut只能使用一个数据库,甚至可以连接两个数据库,java,hibernate,jpa,micronaut,micronaut-data,Java,Hibernate,Jpa,Micronaut,Micronaut Data,我已经用两个MySQL数据库配置了Micronaut应用程序,但它总是使用默认数据源执行操作 如何处理多个数据库 以下是我的application.yml配置: datasources: default: url: jdbc:mysql://localhost:3306/micronaut_demo username: root password: goti@181994 dialect: MYSQL target: url:
datasources:
default:
url: jdbc:mysql://localhost:3306/micronaut_demo
username: root
password: goti@181994
dialect: MYSQL
target:
url: jdbc:mysql://localhost:3306/micronaut_demo_target
username: root
password: goti@181994
dialect: MYSQL
jpa:
default:
packages-to-scan:
- 'com.example'
properties:
hibernate:
hbm2ddl:
auto: create-drop
show_sql: true
target:
properties:
hibernate:
hbm2ddl:
auto: create-drop
show_sql: true
这是我的存储库
声明:
@Singleton
@Repository("target")
public class DepartmentRepositoryImpl implements DepartmentRepository {
private EntityManager entityManager;
public DepartmentRepositoryImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
@ReadOnly
public Optional<Department> findById(Long id) {
return Optional.ofNullable(entityManager.find(Department.class, id));
}
@Override
@Transactional
public Department save(String name) {
//save logic
}
}
您可以使用
@EachBean
注释对@Repository
bean进行注释,该注释将EntityManager
指定为依赖类型,允许Micronut为每个创建的EntityManager
(以及引擎盖下的每个数据源
)创建bean:
或者动态使用注入的应用程序上下文
:
@Singleton
public class ServiceImpl implements Service {
private ApplicationContext applicationContext;
public ServiceImpl(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public Department save(String name) {
return this.save(name, "default");
}
public Department save(String name, String targetDataSource) {
return this.applicationContext.getBean(DepartmentRepository.class, Qualifiers.byName(target)).save(name);
}
}
请添加
DepartmentRepository
声明,好吗?您如何调用部门repositoryimpl
存储库bean?您能添加调用方代码段吗?谢谢您的回复,DepartmentRepository只是一个接口,只有声明的方法。我和我们一样,通过注入DepartmentRepository来调用这些方法。
@EachBean(EntityManager.class)
@Repository
public class DepartmentRepositoryImpl implements DepartmentRepository {
private EntityManager entityManager;
public DepartmentRepositoryImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
@ReadOnly
public Optional<Department> findById(Long id) {
return Optional.ofNullable(entityManager.find(Department.class, id));
}
@Override
@Transactional
public Department save(String name) {
//save logic
}
}
@Singleton
public class ServiceImpl implements Service {
private DepartmentRepository departmentRepository;
public ServiceImpl(@Named("target") DepartmentRepository departmentRepository) {
this.departmentRepository = departmentRepository;
}
@Override
public Department save(String name) {
return this.departmentRepository.save(name);
}
}
@Singleton
public class ServiceImpl implements Service {
private ApplicationContext applicationContext;
public ServiceImpl(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public Department save(String name) {
return this.save(name, "default");
}
public Department save(String name, String targetDataSource) {
return this.applicationContext.getBean(DepartmentRepository.class, Qualifiers.byName(target)).save(name);
}
}