Как я могу настроить DDL, сгенерированный с помощью hbm2ddl Hibernate (используя аннотации)? - PullRequest
2 голосов
/ 06 января 2011

Вот что я хочу сделать:
Я использую Hibernate (3.3.2) для сопоставления своей базы данных Ingres 10. Мои java-сущности создаются после метамодели, поэтому мы решили использовать аннотации для упрощения вещей.
То, что мы хотим сделать после генерации кода, это сгенерировать инструкции DDL для создания базы данных, поэтому мы используем инструмент hbm2ddl и имеем что-то вроде:

drop table xxx;
create table xxx ...;

Что мне здесь не хватает, так это дополнительные операторы SQL, например, добавить привилегии для таблиц, что-то вроде:

drop table xxx;
create table xxx ...;
grant xxx on table xxx;

Я знаю, что мог бы использовать нечто под названием объект базы данных для генерации таких операторов, но я думаю, что это доступно только с отображением XML. Вы можете это подтвердить?
Если это подтвердится, вы видите лучшее решение для такой вещи?
Большое спасибо всем.

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

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

#!/bin/bash

SQL_FILE=$1
GROUP=$2
COMPILED=$1.tmp
SCHEMA_DROP=$3
if [ "$3" == "" ]; then
    SCHEMA_DROP="true"
fi


mvn hibernate3:hbm2ddl -Dschema.file=$SQL_FILE -Dschema.drop=$SCHEMA_DROP

if [ "$SQL_FILE" == "" ] || [ "$GROUP" == "" ] ; then
    echo "Usage: $0 {SQL_FILE} {GROUP} [DROP_SCHEMA]"
    echo "Where: "
    echo "SQL_FILE: path to sql file relative to the root of the project"
    echo "GROUP: the predefined database group on which to grant access"
    echo "DROP_SCHEMA: true|false per the hbm2ddl 'drop' parameter.  Defaults to true"
    echo "NOTE: In order for this to work properly, the pom configuration of the hibernatetool should be parameterized.  For example:"
    echo '<hbm2ddl outputfilename="../../../${schema.file}" format="true" drop="${schema.drop}" />'
    exit;
fi

echo "" > $COMPILED
GRANT=""
while read line
do
    echo $line >> $COMPILED
    if [[ $line =~ .*create.table.([A-Za-z_-]*) ]]; then
        GRANT="$GRANT\ngrant all on table ${BASH_REMATCH[1]} to group $GROUP;" >> $COMPILED 
    fi
done < $SQL_FILE

echo -e $GRANT >> $COMPILED

mv $COMPILED $SQL_FILE

Мне нравится помещать мой файл схемы в каталог src для регистрации, например, src / main / db / myschema.sql, отсюда и каталогup значения в атрибуте outputfilename (см. ПРИМЕЧАНИЕ в комментариях к использованию).Чтобы запустить этот скрипт с именем файла «genSchema.sh» из корня проекта в cygwin:

./genSchema.sh src/main/db/myschema.sql mygroup

Регулярное выражение и сгенерированные строки гранта предназначены для диалекта postgresql.Возможно, им понадобится небольшая модификация для других диалектов.

0 голосов
/ 06 января 2011

Я не очень хорошо знаю Hibernate (только NHibernate), и я не очень хорошо знаю эти аннотации.Но я уверен, что это доступно только в файлах сопоставления XML.

Возможно, вы найдете способ объединить аннотации и сопоставления XML.Если это невозможно, рассмотрите возможность перехода на XML полностью, как правило, он более мощный и вы получаете больший контроль.

...