Java 在Micronaut中有多个数据源的情况下获取EntityManager的特定实例
我对Micronaut应用程序的application.yml中的两个不同数据源有以下定义-Java 在Micronaut中有多个数据源的情况下获取EntityManager的特定实例,java,jpa,datasource,micronaut,micronaut-data,Java,Jpa,Datasource,Micronaut,Micronaut Data,我对Micronaut应用程序的application.yml中的两个不同数据源有以下定义- datasources: default: url: <jdbc-url> driverClassName: org.postgresql.Driver username: <username> password: <password> dialect: POSTGRES schema: <schema>
datasources:
default:
url: <jdbc-url>
driverClassName: org.postgresql.Driver
username: <username>
password: <password>
dialect: POSTGRES
schema: <schema>
ms-sql:
url: <jdbc-url>
driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: <username>
password: <password>
dialect: org.hibernate.dialect.SQLServer2012Dialect
schema: <schema>
对于每个
数据源
配置(也注入由配置属性
驱动的bean数据源配置
),Micronaut将创建一个合格的会话工厂
bean
在下面,每个合格的SessionFactory
将导致TransactionManager
合格bean的创建
根据io.micronaut.context.annotation.EachBean
注入机制,创建的每个bean将在驱动其创建的bean限定名之后@命名
从配置到bean创建的简短注入路径如下:
datasources.some-datasource-name (configuration item within your .yaml, .properties...)
|
|
v
DataSourceConfiguration @Named("some-datasource-name")
|
|
v
DataSource @Named("some-datasource-name")
|
|
v
SessionFactory @Named("some-datasource-name")
|
|
v
TransactionManager @Named("some-datasource-name")
|
|
v
RepositoryOperations @Named("some-datasource-name")
然后,您必须以编程方式使用限定的TransactionManager
以及事务感知的EntityManager
来执行JPA操作(请注意,编程事务样式中不再需要@Transactional
注释):
@Singleton
公共类MyServiceImpl实现了MyService{
私有EntityManager em;//事务感知bean
私有最终同步transactionManager transactionManager;
公共MyServiceImpl(@NonNull EntityManager EntityManager,@NonNull@Named(“ms sql”)SynchronousTransactionManager transactionManager){
this.em=实体管理器;
this.transactionManager=transactionManager;
}
@凌驾
公共int callSP(int num){
返回transactionManager.executeRead(状态->{
StoredProcedureQuery=em.createStoredProcedureQuery(“storelist.testSP1”)
.registerStoredProcedureParameter(“Input”、Integer.class、ParameterMode.IN)
.registerStoredProcedureParameter(“OutputInt”、Integer.class、ParameterMode.OUT)
.setParameter(“输入”,num);
query.execute();
return(Integer)query.getOutputParameterValue(“OutputInt”);
});
}
}
或者注入一个合格的RepositoryOperations
,在您的情况下,它将是hibernatejbaooperations
的一个实例,并用于查询您的数据源
datasources.some-datasource-name (configuration item within your .yaml, .properties...)
|
|
v
DataSourceConfiguration @Named("some-datasource-name")
|
|
v
DataSource @Named("some-datasource-name")
|
|
v
SessionFactory @Named("some-datasource-name")
|
|
v
TransactionManager @Named("some-datasource-name")
|
|
v
RepositoryOperations @Named("some-datasource-name")