【问题标题】:DB connectivity fails in grails 5 application with error creating hibernateDatastoregrails 5 应用程序中的数据库连接失败,并在创建 hibernateDatastore 时出错
【发布时间】:2022-01-10 15:08:38
【问题描述】:

我正在将应用程序升级到 grails-5。我已将我的数据库连接信息从自定义 DataSource.groovy 移动到 application.yml。 环境: 发展: 数据源: dbCreate:更新 url: jdbc:mysql://hostName:port/DbName?user=x;password=y

凭据正确,但应用程序无法启动并引发以下错误。

springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to i
nstantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is org.hibernate.MappingException: Could not determine type for: org.springframework.transaction.PlatformTransactionManager, at t
able: <<table_name>>, for columns: [org.hibernate.mapping.Column(transaction_manager)]

【问题讨论】:

  • 看起来您可能在某个映射到数据库的实体中有一个名为 transactionManager 的属性。可能发生的原因有很多。一种是标有@Transactional 的域类。但是,如果没有看到代码,很难确定。
  • 这可能与您几年前在stackoverflow.com/questions/55416278/… 提出的问题类似
  • @JeffScottBrown,你是对的。它确实发生在具有@Transactional annotation 的类上。你能帮我理解为什么@Transactional 会导致这个吗?我很困惑,因为在 grails 2 中它运行良好。
  • "你能帮我理解为什么@Transactional 会导致这个吗?" - 注释有一个与之关联的 AST 转换,它将事务管理相关的代码添加到类中,包括transactionManager。没有充分的理由用@Transactional 标记域类。

标签: grails grails-orm grails-domain-class


【解决方案1】:

如果您在域类上有@Transactional(没有充分理由这样做),这将导致将名为transactionManager 的属性添加到类中。这是执行事务管理逻辑所必需的。问题是域类中的属性默认映射到数据库,除非它们被配置为瞬态。

您应该从域类中删除@Transactional 注释,并将任何事务逻辑移动到管理事务的任何位置,这通常位于事务服务中。

【讨论】:

  • 谢谢!是的。域类上的@Transactional 是问题的根源。通过简单地删除此注释,我解决了这个问题。由于某种原因,我在 grails-2 中没有这个问题。不过这个问题现在解决了!再次感谢!
  • “由于某种原因,我在 grails-2 中没有遇到这个问题。” - 自 Grails 2 以来,我们的实现发生了变化。
猜你喜欢
  • 2015-11-13
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
相关资源
最近更新 更多