无法使用 Spring Boot + GORM + Gradle 设置 NamingStrategy
Posted
技术标签:
【中文标题】无法使用 Spring Boot + GORM + Gradle 设置 NamingStrategy【英文标题】:Unable to set NamingStrategy using Spring Boot + GORM + Gradle 【发布时间】:2014-12-29 22:29:15 【问题描述】:我们正在使用带有 GORM 和 Gradle 的 Spring Boot 开始一个新项目。我已经能够为 hibernate 配置大多数属性,但到目前为止我还没有找到设置命名策略的正确方法。
尝试
我尝试在 application.properties 中设置各种属性并添加文件 hibernate.properties。我们正在使用自动配置,我看到在 HibernateGormAutoConfiguration 中发现并添加了道具。
我也尝试过创建实体管理器和会话工厂 bean,但没有成功。
application.properties 中的示例(尝试所有排列):
spring.hibernate.hbm2ddl.auto=none # this works!!
# from now on none works
# I tried all permutations with combinations of
# *.hibernate[.ejb].* and *.naming_strategy/naming-strategy
spring.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
spring.hibernate.ejb.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
spring.jpa.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
spring.properties.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
spring.jpa.properties.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
spring.gorm.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
spring.gorm.properties.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
gorm.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
来自 src/main/resources/hibernate.properties 的示例:
hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
hibernate.ejb.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy
启动应用程序并尝试加载实体时的日志记录和堆栈跟踪:
2014-11-03 10:12:04.381 INFO 81729 --- [ main] org.hibernate.cfg.Environment : HHH000205: Loaded properties from ...
resource hibernate.properties: hibernate.ejb.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy, hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy, hibernate.bytecode.use_reflection_optimizer=false
2014-11-03 10:09:28.825 WARN 81619 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 207, SQLState: 42S22
2014-11-03 10:09:28.825 ERROR 81619 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Invalid column name 'origin_marking'.
2014-11-03 10:09:28.839 ERROR 81619 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[jerseyServlet] : Servlet.service() for servlet [jerseyServlet] in context with path [] threw exception [org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not extract ResultSet; bad SQL grammar [n/a]; nested exception is java.sql.SQLException: Invalid column name 'origin_marking'.] with root cause
java.sql.SQLException: Invalid column name 'origin_marking'.
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
代码示例
不幸的是,基于每个字段覆盖字段名称不是一个可行的解决方案:
static mapping =
columns
originMarking column: 'originMarking'
构建文件的摘录如下所示:
.. // main build file
buildscript
repositories
jcenter()
maven url "http://repo.spring.io/milestone"
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.0.M2")
classpath 'org.springframework:springloaded:1.2.0.RELEASE'
..
apply plugin: 'spring-boot'
..
.. // domain build file
jar.baseName = 'domain'
dependencies
compile "org.grails:gorm-hibernate4-spring-boot:1.1.0.RELEASE",
"joda-time:joda-time:2.5",
'org.jadira.usertype:usertype.jodatime:2.0.1',
"commons-dbcp:commons-dbcp:1.4",
"net.sourceforge.jtds:jtds:1.2.7"
runtime "com.h2database:h2"
..
.. // api build file
apply plugin: 'spring-boot'
jar.baseName = 'api'
dependencies
compile project(':domain')
compile "org.springframework.boot:spring-boot-starter-jersey"
..
任何帮助将不胜感激!
此代码与此处提出的问题属于同一项目的一部分:Spring boot Jersey with groovy/gradle fails on startup
【问题讨论】:
您是否尝试过application.properties
中记录的spring.jpa.hibernate.naming-strategy
?
是的。这就是我试图用“尝试所有排列”以及对 application.properties '# 以及 hibernate.ejb* 和 *.naming_strategy/naming-strategy 结尾的评论说的(有点神秘)。我更改了描述的那部分,希望它更清楚。
然后我怀疑 GORM 是在内部设置/覆盖它或类似的东西。
我同意您的怀疑,但迄今为止无法追踪覆盖(或类似情况)发生的位置。降级 spring-boot 版本是一种替代方法(以确定这是否可能是当前版本中的错误),但因为 *-starter-jersey 在当前版本中是新的,我希望避免这样做。
我怀疑 gorm 的内部结构,但我对 GORM 的了解还远远不够。
【参考方案1】:
Grails 确实使用了spring.hibernate.naming_strategy
设置,但并没有按照您的预期使用它,并且它保持默认命名策略不变。我不确定这是什么原因。您可能想raise an issue 与 Grails 团队讨论。
同时,可以通过在AbstractGrailsDomainBinder
上调用configureNamingStrategy
以编程方式配置默认命名策略。例如:
@EnableAutoConfiguration
class Application
static void main(String[] args)
AbstractGrailsDomainBinder.configureNamingStrategy('DEFAULT', DefaultNamingStrategy)
SpringApplication.run Application, args
【讨论】:
您的解决方案很有魅力@AndyWilkinson,非常感谢。我会向 Grails 团队提出一个问题。以上是关于无法使用 Spring Boot + GORM + Gradle 设置 NamingStrategy的主要内容,如果未能解决你的问题,请参考以下文章
使用 spring-boot:1.5.1 和 spring-cloud-stream 时无法启动 bean 'inputBindingLifecycle'
无法使用 Spring Boot 应用程序连接到 Docker 映像