【问题标题】:GORM: automatically prefix each table name with the domain class namespaceGORM:自动为每个表名添加域类命名空间的前缀
【发布时间】:2014-09-05 17:54:22
【问题描述】:

我已将所有域类分隔到命名空间中,我希望 GORM 使用表前缀将这种分隔保持在 DB 级别。

例如:

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 的地方。

【问题讨论】:

  • 您在域类中尝试过静态mapping = { table 'your_custom_name' } 吗?您也可以创建自己的插件来访问grails.gorm.table.prefix.enabled。如果我正确理解了您的问题。
  • 是的,我可以在每个类中编写映射表。但我正在寻找一个通用的解决方案,写一次就忘了。编写自己的插件是我没有考虑过的事情,但它可能是一种选择,继续前进。
  • 您可以为域类编写自己的注释或 AST。但是您必须提供您的注释/AST 将在 grails AST 之前运行。
  • 请看这三个链接onetwothree

标签: hibernate grails naming-conventions grails-orm naming


【解决方案1】:

您可以使用自定义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

【讨论】:

  • 有效!考虑到 Hibernate API,我想这是我们能做的最好的事情。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-01-06
  • 2012-10-22
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多