我已将所有域类分隔为名称空间,我希望GORM使用表前缀在数据库级别保持这种分离。
例如:
auth.User -> auth__user
auth.Group -> auth__group
auth.Role -> auth__role
cms.Page -> cms__page
cms.Post -> cms__post
cms.Image -> cms__image
我正在寻找一种方法,而不必在每个域类中编写表名。
我已经让Hibernate识别出一个自定义的NamingStrategy,但是我传递给classToTableName()的字符串只是短类名;命名空间无处可见。
有没有办法编写一个知道类命名空间是什么的NamingStrategy? (possibly not)
我可以尝试一些其他自动Grails的东西吗?也许一些代码可以写一次并应用于所有域类?
我看到Grails对插件有grails.gorm.table.prefix.enabled
设置,有些人设法将插件名称加到表格前面。我可以使用相同的技术添加我的命名空间吗?我查看了消息来源,但我找不到grails.gorm.table.prefix.enabled
被阅读和应用的地方。
答案 0 :(得分:2)
您可以使用自定义NamingStrategy
来实现您的要求。
为此,您已在DataSource.groovy
中添加以下行hibernate {
...
naming_strategy = com.test.CustomNamingStrategy
}
你必须延长ImprovedNamingStrategy
package com.test
import grails.util.Holders
import org.hibernate.cfg.ImprovedNamingStrategy
/**
* Created by ramsharan on 9/11/14.
*/
class CustomNamingStrategy extends ImprovedNamingStrategy {
String classToTableName(String className){
Class clazz = Holders.grailsApplication.domainClasses.find { it.clazz.simpleName == className }.clazz
String packageName = clazz.getPackage().getName()
"${packageName}__${className.toLowerCase()}"
}
}
我使用了以下两个链接作为参考: