Hibernate中需要class和mapping file, 也就是java文件和hbm.xml文件,由于Hibernate只支持DML, 不支持DDL,所以在DB中需要有DDL或已经存在的数据库的表。Hibernate中共有三种文件与代码自动生成功能有关: class, mapping file and DDL
1. Middlegen 是用来从DB中已存在的表,生成相应的mapping file. 可以下载一个老外的middlegen的例子。 http://sourceforge.net/project/showfiles.php?group_id=40712
调用Middlegen很简单,例子中的middlegen自动生成ant指令如下
引用
<middlegen appname="${name}" prefsdir="${src.dir}" gui="${gui}" databaseurl="${database.url}" initialContextFactory="${java.naming.factory.initial}" providerURL="${java.naming.provider.url}" datasourceJNDIName="${datasource.jndi.name}" driver="${database.driver}" username="${database.userid}" password="${database.password}"
> <hibernate destination="${build.gen-src.dir}" package="${name}.hibernate" /> </middlegen>
然后会有一个GUI,给我们专门设计各种表与表之间的关系(一对一,一对多以及单向双向关系)。需要说明的是,middlegen生成的代码没有直接写mapping file灵活性好,所以生成的mapping file有时还需要我们去修改。
2. XDoclet 它是用来从java文件自动生成hbm文件的,不过我们需要在java代码中写一些规定的tag,才能得到自动生成的hbm文件.
代码
-
<
hibernatedoclet
-
destdir
=
"src"
-
excludedtags
=
"@version,@author,@todo"
-
force
=
"true"
-
verbose
=
"true"
>
-
<
fileset
dir
=
"src"
>
-
<
include
name
=
"**/*.java"
/>
-
<
exclude
name
=
"**/Product.java"
/>
-
</
fileset
>
-
<
hibernate
version
=
"2.0"
/>
-
</
hibernatedoclet
>
3. hbm2java 它是用来从mapping 文件生成java代码的工具,调用很简单,在参数中需要给出所有的hbm文件,如下:
代码
-
<
java
classname
=
"net.sf.hibernate.tool.hbm2java.CodeGenerator"
fork
=
"true"
>
-
<
classpath
refid
=
"classpath"
/>
-
<
arg
line
=
"${build.gen-src.dir}/airline/hibernate/*.hbm.xml"
/>
-
</
java
>
4. SchemaExport 如果写好了java文件和hbm文件,就可以用SchemaExport直接生成DDL文件,调用同样简单,只需在java代码中,加入如下:
代码
-
conf =
new
Configuration()
-
.addClass(a.
class
)
-
.addClass(b.
class
);
-
SchemaExport dbExport =
new
SchemaExport(conf);
-
dbExport.setOutputFile(
"myschema.sql"
);
-
dbExport.create(
true
,
true
);
从这四种自动生成工具来看, mapping file, java file and DDL,只要知道任何一种文件,都可以得到另外两种文件, 如:
1. 只有mapping file: mapping file---hbm2java----java---SchemaExport----DDL
2.只有DDL DDL---Middlegen---hbm----hbm2java----java
3.只有Java java---XDoclet---hbm----SchemaExport----DDL
从这里,大家也可以体会到, Hibernate强大的灵活性。
|