GORM:使用域类命名空间自动为每个表名添加前缀

时间:2014-09-05 17:54:23

标签: hibernate grails naming-conventions gorm naming

我已将所有域类分隔为名称空间,我希望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被阅读和应用的地方。

1 个答案:

答案 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()}"
    }
}

我使用了以下两个链接作为参考:

For Custom Naming Strategy

For getting package name from class name