Micronaut, JPA, EntityManager: без источника данных из application.yml выдает ошибку «Менеджер транзакций не настроен» - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь использовать управление транзакциями JPA с пакетной вставкой с использованием Micronaut + Postgresql.

| Микронавт Версия: 1.1.3 | Версия JVM: 1.8.0_212

Я настроил проект Micronaut для использования 'micronaut-hibernate-jpa' в build.gradle.

compile "io.micronaut.configuration:micronaut-hibernate-jpa"

Подход высокого уровня подобен этому и отлично работает, когда источник данных определен в application.yml.

мой интерфейс

interface myrepository
{
  savebatch (@NotNull List<ConsumerRecord<String, MyBusinessClass>> buffer
}

моя реализация интерфейса

@Slf4j
@Singleton
@EnableTransactionManagement
class myrepositoryimpl implements myrepository
{
  @PersistenceContext
  private EntityManager entityManager

  myrepositoryimpl(@CurrentSession EntityManager entityManager){
   this.entityManager = entityManager
  }

  @Override
  @Transactional    
  public savebatch (...)
  {
      ..some business logic
       entity.persist(...)
    ....
      entity.flush()
      entity.clear()
   }
}

Приведенный выше код работает нормально, если я использую источник данных из application.yml.

Мое требование : мое приложение требует создания источников данных во время выполнения. Поэтому я удалил dagtasource и другие детали из application.yml и создал их во время выполнения.

для подходов Dynami c. Я инициализирую EntityManger в конструкторе со следующим фрагментом кода, но выдает ошибку времени выполнения как ' Не настроен менеджер транзакций '

HibernatePersistenceProvider hibernatePersistenceProvider = new HibernatePersistenceProvider();

Map <String,Object> properties = new HashMap<String,Object>();

properties.put(org.hibernate.cfg.AvailableSettings.JPA_JDBC_DRIVER, 'org.postgresql.Driver')
properties.put(org.hibernate.cfg.AvailableSettings.JPA_JDBC_URL, 'jdbc:postgresql://...')
properties.put(org.hibernate.cfg.AvailableSettings.DIALECT, PostgreSQL10Dialect.class)
properties.put(org.hibernate.cfg.AvailableSettings.JPA_JDBC_USER, '...')
properties.put(org.hibernate.cfg.AvailableSettings.JPA_JDBC_PASSWORD, '...')

properties.put(org.hibernate.cfg.AvailableSettings.SHOW_SQL, false)

EntityManagerFactory entityManagerFactory = hibernatePersistenceProvider
        .createContainerEntityManagerFactory(persistenceUnitInfo, properties);

def entityManager = entityManagerFactory.createEntityManager()

log.info "Setting entity manager factory "
JpaTransactionManager txManager = new JpaTransactionManager();

txManager.setEntityManagerFactory((EntityManagerFactory)entityManagerFactory);
DataSource dataSource = DataSourceBuilder.create()
        .driverClassName('org.postgresql.Driver')
        .url('jdbc:postgresql://...')
        .password('...')
        .username('...')
        .build()

if (dataSource!= null){
    log.info "Valid datasource created"
    txManager.setDataSource(dataSource);
}

context.registerSingleton(entityManager)

return entityManager

}

, перешел по нескольким ссылкам и Google .

https://guides.micronaut.io/micronaut-data-access-jpa-hibernate/guide/index.html

https://micronaut-projects.github.io/micronaut-data/latest/guide/#graalJPA

Как использовать EntityManager с Micronaut?

1 Ответ

0 голосов
/ 09 января 2020

Я не уверен, почему вы создаете менеджер сущностей вручную, в этом нет необходимости, поскольку Micronaut уже включает в себя возможность автоматической настройки менеджера сущностей для вас. См. https://micronaut-projects.github.io/micronaut-sql/latest/guide/#hibernate

Однако, если вы должны сделать это, то при регистрации синглтона вы должны зарегистрировать его с именованным квалификатором «default», поскольку именно так Micronaut ожидает источник данных по умолчанию для вызова, и вы также должны зарегистрировать сам источник данных как bean-компонент.

context.registerSingleton(dataSource, Qualifiers.byName("default"));
context.registerSingleton(entityManager, Qualifiers.byName("default"));

Однако, как я уже говорил, это не поддерживаемый или рекомендуемый подход к настройке фабрики диспетчера сущностей

...