2014-09-05 144 views
1

我已將所有域類分離到命名空間中,並希望GORM使用表前綴在數據庫級別保留此分隔。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

有沒有其他automagic的事情我可以試試?也許有些代碼可以編寫一次並應用於所有的域類?

我看到Grails的插件設置爲grails.gorm.table.prefix.enabled,somehows管理將插件名稱作爲表格的前綴。我可以使用相同的技術來添加我的名稱空間嗎?我查看了消息來源,但我找不到grails.gorm.table.prefix.enabled被讀取和應用的地方。

+0

您是否嘗試過在域類中使用靜態'mapping = {table'your_custom_name'}?而且你也可以創建自己的插件來訪問'grails.gorm.table.prefix.enabled'。如果我正確理解你的問題。 – wwarlock 2014-09-08 12:42:36

+0

是的,我可以在每個班級編寫映射表。但是我正在尋找一種通用的解決方案來寫一次而忘記。編寫我自己的插件是我沒有考慮過的,但它可能是一種選擇,向前邁進。 – Tobia 2014-09-08 13:21:07

+0

您可以爲域類編寫自己的註釋或AST。但是您必須提供您的註釋/ AST將在grails AST之前運行。 – wwarlock 2014-09-08 19:01:34

回答

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

+1

它的工作原理!我想這是我們可以做的最好的,因爲Hibernate API。謝謝 – Tobia 2014-09-11 15:37:41