我试图使用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一起使用?
我不确定您为什么要手动创建实体管理器,这是不必要的,因为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配置的一部分。 但是当我运行应用程序时,我的异常值低于异常值。