2014-09-05 2 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)

Есть ли какие-нибудь другие автоматы Grails, которые я мог бы попробовать? Может быть, какой-то код, который можно было бы написать один раз и применить ко всем классам домена?

Я вижу, что у Grails есть настройки для плагинов grails.gorm.table.prefix.enabled, которые некоторым пользователям удается префикс имени плагина для таблиц. Могу ли я использовать ту же технику для добавления пространства имен? Я посмотрел в источниках, но я не мог найти место, где читается и применяется grails.gorm.table.prefix.enabled.

+0

Вы пробовали статическое 'mapping = {table 'your_custom_name'}' в классе домена? А также вы можете создать свой собственный плагин, чтобы получить доступ к 'grails.gorm.table.prefix.enabled'. Если я правильно понял ваш вопрос. – wwarlock

+0

Да, я мог бы написать таблицу отображения в каждом классе. Но я ищу универсальное решение написать один раз и забыть. Написание собственного плагина - это то, что я не рассматривал, но это может быть вариант, продвигающийся вперед. – Tobia

+0

Вы можете написать свою собственную аннотацию или AST для классов домена. Но вы должны указать, что ваша аннотация/AST будет работать до grails AST. – wwarlock

ответ

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

Он работает! Я думаю, это лучшее, что мы можем сделать, учитывая API-интерфейс Hibernate. спасибо – Tobia