Является ли перегрузка Grails статическим свойством 'mapping' для привязки к объектам базы данных нарушает DRY? - PullRequest
0 голосов
/ 02 апреля 2010

Является ли свойство Grails статическим отображением в классах домена нарушением DRY? Давайте посмотрим на класс канонического домена:

книга класса {
Длинный идентификатор
Название строки
Строка isbn
Дата публикации
Автор автор
статическое отображение = {
генератор идентификаторов: 'hilo', параметры: [таблица: 'hi_value', столбец: 'next_value', max_lo: 100]
}
}

или

Учебник класса {...
статическое отображение = {
id (генератор: 'sequence', params: [sequence_name: "book_seq"])
}
}

И, допустим, продолжая эту мысль, я использую свое приложение Grails с HSQLDB или MySQL, но ИТ-отдел говорит, что я должен использовать коммерческий программный пакет (написанный большой корпорацией в Redwood Shores, Калифорния).

Делает ли это изменение моим веб-приложением благородным в среде разработки и тестирования? MySQL поддерживает автоинкремент для столбца первичного ключа, но поддерживает объекты последовательности, например.

Есть ли более чистый способ реализации такого рода «только в рабочем режиме» без загрузки класса домена?

1 Ответ

1 голос
/ 27 июня 2010

Этот вопрос (относительно: последовательности) больше относится к Hibernate, чем к Grails - и хорошо документирован на нашем сайте

Обычно есть несколько причин, по которым «ИТ-отдел говорит, что я должен использовать коммерческий программный пакет» .... Среди них стандарты именования для объектов базы данных, таких как представления, таблицы и даже столбцы.

Другой причиной может быть такой стандарт, как «каждая таблица должна иметь свою собственную последовательность», что является обычной (часто чрезмерно используемой) практикой для обеспечения того, чтобы идентификаторы объектов попадали в определенные диапазоны. Для этого вы можете добавить блок статического сопоставления для переименований, например, COMMENT становится COMMENT_TBL и подклассом Hibernate Dialect для используемой вами базы данных.


N.B .: Специфичный для ORACLE генератор идентификаторов в замыкании отображения теперь игнорируется средой Grails 1.2.x, поэтому этот вопрос не относится к последним версиям. Смотри JIRA для некоторой предыстории по этому вопросу - и ориг рекомендация здесь . Имейте в виду, что если вы просто хотите использовать подход «одна последовательность на таблицу», вы можете использовать только подкласс Oracle10gDialect, как это рекомендовано hibernate community , в частности Робом Хассельбаумом:

public class TableNameSequenceGenerator extends SequenceGenerator {

/**
 * If the parameters do not contain a {@link SequenceGenerator#SEQUENCE} name, we
 * assign one based on the table name.
 */
public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
    if(params.getProperty(SEQUENCE) == null || params.getProperty(SEQUENCE).length() == 0) {
        String tableName = params.getProperty(PersistentIdentifierGenerator.TABLE);
        if(tableName != null) {
            String seqName = “seq_” + tableName;
            params.setProperty(SEQUENCE, seqName);               
        }
    }
    super.configure(type, params, dialect);
}

}

public class MyDialect extends Oracle10gDialect {
   public Class getNativeIdentifierGeneratorClass() {
      return TableNameSequenceGenerator.class;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...