2011-01-06 96 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的方言。他們可能需要對其他方言稍作修改。