这是我想做的事:
我正在使用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映射。你能证实这一点吗? 如果确认了这一点,你是否看到了做这种事情的更好的解决方案? 非常感谢所有人。
答案 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,它通常更强大,您可以获得更多控制权。