【问题标题】:Micronaut only work with one database even connected with two databasesMicronaut 只使用一个数据库,甚至连接两个数据库
【发布时间】:2021-04-11 06:54:24
【问题描述】:

我已经用两个 MySQL 数据库配置了一个 Micronaut 应用程序,但它总是使用默认数据源执行操作。

如何使用多个数据库?

这是我的 application.yml 配置:

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

这是我的Repository 声明:

@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
    }
}

如您所见,我指定了要使用的数据源:

@Repository("target")

【问题讨论】:

  • 能否添加DepartmentRepository 声明?你怎么称呼DepartmentRepositoryImpl 存储库bean?可以添加调用者 sn-p 吗?
  • 感谢您的回复,DepartmentRepository 只是接口,只有声明的方法。我通过注入 DepartmentRepository 来像往常一样调用这些方法。

标签: java hibernate jpa micronaut micronaut-data


【解决方案1】:

您可以使用 @EachBean 注释来注释您的 @Repository bean,将 EntityManager 指定为依赖类型,允许 Microanut 为每个创建的 EntityManager(以及每个 DataSource引擎盖下):

@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
    }
}

然后你可以根据需要的目标DataSource注入一个合格的DepartmentRepository

@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);
    }
}

或者动态使用注入的ApplicationContext

@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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多