当前位置: 首页 > 知识库问答 >
问题:

Micronaut,JPA,EntityManager:如果没有来自application.yml的数据源,则会出现错误没有配置事务管理器

隆长卿
2023-03-14

我试图使用JPA事务管理与使用Micronaut Postgresql的批处理插入。

|Micronaut版本:1.1.3 | JVM版本:1.8.0 |

我已经配置了Micronaut项目在build.gradle.中使用micronaut-hibernet-jpa

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

高级方法是这样的,当在应用程序中定义数据源时,它可以正常工作。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()
   }
}

如果我使用应用程序中的数据源,上面的代码运行良好。yml。

我的要求是:我的应用程序需要在运行时创建数据源。所以我删除了dagtasource

用于动态方法。我正在用下面的代码片段初始化构造函数中的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

}

下面几个链接和谷歌。

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个答案

李宁
2023-03-14

我不确定您为什么要手动创建实体管理器,这是不必要的,因为Micronaut已经包含了为您自动设置实体管理器的功能。看https://micronaut-projects.github.io/micronaut-sql/latest/guide/#hibernate

然而,如果您必须这样做,那么在注册单例时,您必须用“默认”的命名限定符注册它,因为这是Micronaut期望调用的默认数据源,您还必须将数据源本身注册为bean。

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

然而,就像我说的,这不是一个支持或推荐的方法来配置实体管理器工厂

 类似资料:
  • 根据这里的baeldung 如果我们使用的是Spring Boot项目,并且在类路径上有spring-data-*或spring-tx>依赖项,那么事务管理将通过>default启用。“ serviceConfig.java 哪里出了问题?,我在SpringBoot配置中遗漏了什么? 提前感谢你的帮助

  • 我试图从注入的EntityManager中打开Hibernate会话,因为我需要使用Hibernate的原生标准API。 当我尝试使用标准时,我得到以下异常: 但是,当我使用EntityManager本身的Query api时,一切都很好。 我的配置: db.xml PouzivatelDAOHibernate 不起作用: PouzivatelDAOHibernate,它确实工作: 编辑:我在JP

  • 我正在自己配置Spring Boot应用程序,以运行两个数据库(两个transactionManager相同)。MariaDB和MongoDb。在@Repository中,我已经用@PersistenceContext使用了@Autowired,注释@Transactional正在正确地使用TransactionManager。但对我来说,最有用的是在@Services层上添加@Transacio

  • 问题内容: 项目使用Hibernate(JPA),Spring和Maven。我的实体和DAO在单独的JAR中。 pom.xml: 道: } 我有一个使用Spring的模块。 pom.xml: AppContext.xml: 服务: 当我尝试从EntityManager中获取会话时,遇到以下异常: 问题答案: 您必须在方法周围加上@Transactional批注: 并在您的Spring的xml配置文

  • 问题内容: 当executeQuery函数运行,sql语句正常工作并在sql编辑器上运行时,给出正确的结果时,会发生问题。当它在jdbc上运行时,不会执行。该连接接受多个查询。 java.sql.SQLException:ResultSet来自UPDATE。没有数据。 问题答案: 这是不可能的,您必须将查询分开,以获得可以使用过程或函数的最佳解决方案。 程序应采取 返回结果,在这种情况下,它应该是

  • 当在SpringbatchConfiguration类中配置了Datasource时,我可以运行Springbatch应用程序。但我不想配置数据源。所以我使用了ResourceLestransactionManager。请参阅下面我的配置类。有人指导我如何在不配置Datasource的情况下启动作业,将其作为Batchjob配置的一部分。 但是当我运行应用程序时,我的异常值低于异常值。