Grails定制GORM方言防止'grails shell'工作 - classpath之谜

时间:2014-12-27 17:11:18

标签: hibernate grails gorm

我正在使用Grails 2.3.11。

我的域类使用UUID作为MySQL中存储为二进制(16)的标识符。我在Hibernate中使用了一个非常简单的自定义方言,并将其放在src / java:

class CustomMysqlDialect extends MySQL5InnoDBDialect {
  public CustomMysqlDialect() {
    super();
    registerColumnType(Types.BINARY,"binary(16)");
  }
}

然后在域类中我可以使用

static mapping = {
    id generator: 'uuid2',sqlType:'BINARY(16)'
...
}

grails shell命令外,所有这些工作正常:

± |binary-uuid ✗| → grails shell
| Packaging Grails application.....
| Error Error executing script Shell: 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'transactionManagerPostProcessor': Initialization of bean failed; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean 
property 'sessionFactory'; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'sessionFactory': Invocation of init method failed; nested exception is 
org.hibernate.HibernateException: Could not instantiate dialect class (Use --stacktrace to see 
the full trace)

就像src / java中的类不会被添加到类路径中一样。

grails控制台工作正常,我可以轻松查询/创建/更新我的域类,但我真的很想念shell的交互性......

我也尝试将这个类放在grails-app / utils中,但它没有改变任何东西......

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这对我来说很好。在启动shell之前运行grails cleangrails compile会有帮助吗?另请尝试将--verbose --stacktrace添加到compileshell命令中 - 您可能会错过警告或错误消息:

$ grails clean
$ grails compile --verbose --stacktrace
$ grails shell --verbose --stacktrace

请注意,grails-app/utils具有误导性名称。它不适用于实用程序类,它适用于编解码器。将所有不是grails-app工件的Groovy和Java代码(控制器,服务,编解码器等)放在src/groovysrc/java中。