如何自定义使用Hibernate的hbm2ddl(使用注释)生成的DDL?

时间:2011-01-06 09:28:13

标签: java hibernate ddl

这是我想做的事:
我正在使用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;

我知道我可以使用一个名为database-object的东西来生成这样的语句,但我认为它只能用于XML映射。你能证实这一点吗? 如果确认了这一点,你是否看到了做这种事情的更好的解决方案? 非常感谢所有人。

2 个答案:

答案 0 :(得分:1)

有点晚了,而不是最漂亮的解决方案,但这里有一个快速而又脏的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,因此outputfilename属性中的dir up值(请参阅用法注释中的NOTE)。从cygwin中项目的根目录运行文件名为“genSchema.sh”的脚本:

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

正则表达式和生成的授权行用于postgresql方言。他们可能需要对其他方言稍作修改。

答案 1 :(得分:0)

我不知道Hibernate(只有NHibernate),我不太了解这些注释。但我很确定这只适用于XML映射文件。

您可能会找到一种组合注释和XML映射的方法。如果无法做到这一点,请考虑完全切换到XML,它通常更强大,您可以获得更多控制权。