2011-01-06 92 views
2

以下是我想要做的:
我使用Hibernate(3.3.2)来映射我的Ingres 10数据库。我的Java实体是在元模型之后生成的,因此我们决定使用注释来缓解事情。
我们想要的代码生成后,做的是产生DDL的指令来创建数据库,所以我们使用就是hbm2ddl工具,我们有这样的事:如何自定义使用Hibernate的hbm2ddl生成的DDL(使用注释)?

drop table xxx; 
create table xxx ...; 

我想念这里有什么额外的SQL语句,例如添加权限表上,是这样的:

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

我知道我可以使用一些所谓的数据库对象产生这样的声明,但我认为这是唯一可用的XML映射。你能证实这一点吗?
如果这一点得到证实,你是否看到了更好的解决方案来做这样的事情?
非常感谢大家。

+0

您是使用hbm2ddl来有效地创建数据库对象,还是仅用于生成语句? – jpkrohling 2011-01-06 12:37:22

+0

我希望我可以使用hbm2ddl来生成'额外'语句。我的实体已经存在并且被注释了,所以hbm2ddl能够生成像'create table xxx'这样的语句。 – bluttringer 2011-01-07 13:17:09

回答

0

我不知道Hibernate(只有NHibernate)这么多,我不知道这些注释的东西非常好。但我很确定这只能在XML映射文件中使用。

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

+0

嗯,我想到了它(仅使用XML),但在撰写本文时,该项目太高级了,无法切换。我仍然认为Hibernate通过其注释系统缺乏一些功能。对我来说太糟糕了。 – bluttringer 2011-01-10 08:28:37

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,因此DIR了在outputfilename属性值(见注中使用评论)。从项目的根在Cygwin中运行该脚本文件名“genSchema.sh”:

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

的正则表达式和生成的授权线是对PostgreSQL的方言。他们可能需要对其他方言稍作修改。