如何解决在 Micronaut 中获取多个数据源的 EntityManager 的特定实例
我在 Micronaut 应用程序的 application.yml 中有两个不同数据源的以下定义 -
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>
如何在下面的服务类中注入 EntityMananger 的特定实例?
服务类代码段:
@Inject
private EntityManager em;
@Transactional
@Override
public int callSP(int num) {
StoredProcedureQuery query = em.createStoredProcedureQuery("storelist.testSP1")
.registerStoredProcedureParameter("InputInt",Integer.class,ParameterMode.IN)
.registerStoredProcedureParameter("OutputInt",ParameterMode.OUT)
.setParameter("InputInt",num);
query.execute();
Integer result = (Integer) query.getOutputParameterValue("OutputInt");
return result;
}
解决方法
对于每个 DataSource
配置(也注入到由 DataSourceConfiguration
驱动的 bean ConfigurationProperties
),Micronaut 将创建一个合格的 SessionFactory
bean。
在下面,每个合格的 SessionFactory
将导致创建一个 TransactionManager
合格的 bean。
根据 io.micronaut.context.annotation.EachBean
注入机制,创建的每个 bean 都将在驱动其创建的 bean 限定名称之后加上 @Named
。
从配置到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
和 transaction-aware EntityManager
来执行 JPA 操作(注意程序化事务样式不再需要 @Transactional
注释):
@Singleton
public class MyServiceImpl implements MyService {
private EntityManager em; // transaction-aware bean
private final SynchronousTransactionManager<Connection> transactionManager;
public MyServiceImpl(@NonNull EntityManager entityManager,@NonNull @Named("ms-sql") SynchronousTransactionManager<Connection> transactionManager) {
this.em = entityManager;
this.transactionManager = transactionManager;
}
@Override
public int callSP(int num) {
return transactionManager.executeRead(status -> {
StoredProcedureQuery query = em.createStoredProcedureQuery("storelist.testSP1")
.registerStoredProcedureParameter("InputInt",Integer.class,ParameterMode.IN)
.registerStoredProcedureParameter("OutputInt",ParameterMode.OUT)
.setParameter("InputInt",num);
query.execute();
return (Integer) query.getOutputParameterValue("OutputInt");
});
}
}
或者注入一个合格的 RepositoryOperations
,在您的案例中将是 HibernateJpaOperations
的一个实例,并使用它来查询您的数据源。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。