无法使用Spring Boot + GORM + Gradle设置NamingStrategy

时间:2014-11-03 09:31:48

标签: hibernate gradle gorm spring-boot

我们正在使用带有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

1 个答案:

答案 0 :(得分:0)

Grails确实使用spring.hibernate.naming_strategy设置,但不会按照您的预期使用它,并且保持默认命名策略不变。我不确定原因是什么。您可能希望raise an issue与Grails团队讨论。

与此同时,可以通过调用configureNamingStrategy上的AbstractGrailsDomainBinder以编程方式配置默认命名策略。例如:

@EnableAutoConfiguration
class Application {
    static void main(String[] args) {
        AbstractGrailsDomainBinder.configureNamingStrategy('DEFAULT', DefaultNamingStrategy)
        SpringApplication.run Application, args
    }
}