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

标签 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;

我知道我可以使用一种叫做数据库对象的东西来生成这样的语句,但我认为它只适用于 XML 映射。你能确认一下吗?
如果这一点得到证实,您是否认为有更好的解决方案来做这样的事情?
非常感谢大家。

最佳答案

有点晚了,而且不是最漂亮的解决方案,但这里有一个与 maven 一起运行的快速而肮脏的 bash 脚本。希望它能帮助其他人解决这个问题。

#!/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 目录以进行 checkin ,例如 src/main/db/myschema.sql,因此 dir up 值在 outputfilename 属性中(请参阅使用注释中的注释)。要从 cygwin 中项目的根目录运行文件名为“genSchema.sh”的脚本:

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

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

关于java - 如何自定义使用 Hibernate 的 hbm2ddl(使用注释)生成的 DDL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4613441/

相关文章:

java - Hibernate 可以使用 MySQL 的 "ON DUPLICATE KEY UPDATE"语法吗?

java - NonUniqueDiscoveredSqlAliasException 当两个表具有相同的列名时

sql - 创建包含计算列的表

sql - 如何创建具有唯一组合主键的 Postgres 表?

java - 嵌入式 Nashorn - 沙箱执行

java - 当 Runnable 在 UI 线程上运行不是一个选项时,如何延迟生成的线程?

java - 如何处理 Property<T>、更改监听器和属性初始化?

java - 在 Java 中同步人群(第 2 部分)

java - Spring @Transactional 方法中没有事务启动

mysql - MySQL无法添加外键?