惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Webroot Blog
Webroot Blog
U
Unit 42
A
About on SuperTechFans
宝玉的分享
宝玉的分享
月光博客
月光博客
C
CERT Recently Published Vulnerability Notes
P
Privacy International News Feed
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
P
Privacy & Cybersecurity Law Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
Securelist
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Spread Privacy
Spread Privacy
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
B
Blog
I
Intezer
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
V
V2EX
L
LangChain Blog
AI
AI
G
GRAHAM CLULEY
T
Tor Project blog
人人都是产品经理
人人都是产品经理
D
Docker
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
I
InfoQ
Y
Y Combinator Blog
C
Comments on: Blog
GbyAI
GbyAI
www.infosecurity-magazine.com
www.infosecurity-magazine.com
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
H
Help Net Security
Vercel News
Vercel News
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿

博客园 - 郄永军

用触发器实现表的同步操作 Quartz CronTrigger最完整配置说明 - 郄永军 - 博客园 如何优化JAVA程序开发,提高JAVA性能 如何用java调用c++编写成的DLL Web.xml加载顺序 java性能优化 Java NIO简介 选用ibatis和hibernate的区别 Fusioncharts 参数 dwr介绍 ASP.NET缓存:方法分析和实践示例 比较同一数据库不同版本间数据表之间差异 如何动态执行存储过程或函数 NTKO正文控件的使用技巧 - 郄永军 - 博客园 Dorado开发框架下保存附件存草稿功能 - 郄永军 - 博客园 JS中的关于类型转换的性能优化 - 郄永军 - 博客园 如何把ini文件转换为xml 生成随即的数值 获取文件大小的java程序 - 郄永军
使用Hibernate+Middlegen实现自动代码生成简介
郄永军 · 2010-12-14 · via 博客园 - 郄永军

前言:

在使用“代码生成器”插件时,第一步会自动生成业务对象文件XX.javaHibernate映射文件XX.hbm.xml; 下面就这一步骤的实现原理做一下简要的介绍和讲解。在支持“代码生成器”插件运行的“resource”文件夹 (一般我们都把它放在需要自动代码生成的项目根目录下) 中有一个叫做“build-hibernate.xml.vm”的模板文件,它是.用来真正生成一个需要Ant 来执行的一个Ant脚本文件,就是我们通常看到的“avicit-build.xml”文件,最终我们所需要自动生成的业务对象文件XX.javaHibernate映射文件XX.hbm.xml就是通过Ant来执行这个“avicit-build.xml”脚本文件所生成的。

正文:

    第一部分:Middlegen 简介

<target name="gen-hbm" depends="init">

    <middlegen

         appname="${package}"

         prefsdir="."

         gui="${gui}"

         databaseurl="${database.url}"

         driver="${database.driver}"

         username="${database.userid}"

         password="${database.password}"

         schema="${database.schema}"

         catalog="${database.catalog}"

      >

      <hibernate

                 version="${version}"

            destination="${dest.dir}"

            package="\${package}"

            genXDocletTags="${gen.xdoclet-tag}"

               standardCascade="${hibernate.cascade}"

    javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"

 />

 <table name="${table}" />

 </middlegen>

 </target>

 <target name="gen-java" depends="gen-hbm">

    <hbm2java output="${dest.dir}">

      <fileset dir="${dest.dir}">

        <include name="${hbm}" />

      </fileset>

    </hbm2java>

 </target>

在上面的“build-hibernate.xml.vm”的模板文件中,我们会找到下面这两个target <target name="gen-hbm"…> <target name="gen-java"…>里面我们还会找到<middlegen> <hbm2java>这两个task。下面是“build-hibernate.xml.vm”模板文件中对这两个task的定义:

<taskdef

        name="middlegen"

        classname="middlegen.MiddlegenTask"

        classpathref="middlegen.classpath"

     />

<taskdef

        name="hbm2java"

        classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"

        classpathref="hibernate-ext.classpath"

     />

在这里我们用到了middlegen.MiddlegenTask类,它就是Middlegen这个开源代码生成框架为我们提供的。<<Middlegen is an open source code generation framework that provides a general-purpose database-driven engine using various tools such as JDBC, Velocity, Ant and XDoclet>>

使用Hibernate的一个不便之处就是要维护数据库schemahbm文件和java文件的一致性,而Middlegen可以帮助我们完成这些。

Middlegen是一个基于Xdoclet的代码,配置文件自动生成工具。它支持目前流行的大部分的技术,例如EJBJDOHibernateTorqueJSP/Struts等。Middlegen主要根据我们已有的数据库Schema根据我们的要求来自动的生成我们所需要的文件,这大大的降低了开发难度,提高了开发速度。使用Middlegen的另一个显而易见的好处是我们所有的代码可以在一分钟之内和数据库同步。

第二部分:使用Middlegen生成业务对象文件XX.javaHibernate映射文件XX.hbm.xml

使用Middlegen自动的生成Hbm文件和Java文件包括两步,第一,根据数据库Schema生成Hbm文件。第二,根据hbm文件生成与之对应得Java文件,这些文件主要是与数据库表对应得持久化类。Middlegen的主要功能都必须在Ant环境下使用,下述build文件片断说明了如何定义自定义的任务(task

<taskdef

name="middlegen"

classname="middlegen.MiddlegenTask"

classpathref="classpath.path"/>

<taskdef

name="hbm2java"

classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"

classpathref="classpath.path"/>

其中第一个taskdef定义了用于根据数据库schema生成hbm文件的自定义任务(middlegen)。第二个taskdef定义了用于使用hbm文件自动生成持久化Java文件的自定义任务(hbm2java)。其中要说明的是classpath.path指定的路径下必须包含middlegen携带的jar文件和hibernate携带的jar文件

第三部分:使用自定义任务来生成hbm文件。

<target name="mid-gen" depends="mid-init">

<taskdef

name="middlegen"

classname="middlegen.MiddlegenTask"

classpathref="classpath.path"/>

<middlegen appname="mda"

prefsdir="${conf.dir}"

gui="false"

databaseurl="${config.database.url}"

driver="Oracle.JDBC.driver.OracleDriver"

username="${config.database.user}"

password="${config.database.password}"

schema="${config.database.user}"

 includeViews="false">

<hibernate destination="${build.src-gen.dir}"

package="entity"

genXDocletTags="true"           javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"/>

</middlegen>

</target>

上述build片断中middlegen部分主要说明了在使用middlegen过程中的一些配置,关于数据库部分不用多说,主要说明guiprefsdir部分。Middlegen自带了一个GUI界面用来即时的变更数据库字段和生成文件之间的映射关系,如果将gui属性设置为true,那么在代码生成之前会跳出一个界面让你来配置数据库字段和生成文件之间的对应关系,但是对于每日构建来说这不太合适,因为这个过程需要人为的干涉,哪怕只是点击确认按钮。同时middlegen提供了一个prefsdir选项,middlegen会自动地在该选项指定的目录下寻找文件appname-prefs.properties,根据该文件中定义的对应关系来生成文件。其中appname就是上述定义的appname,本例中为mda-prefs.properties

hibernate部分主要说明生成hbm文件的一些属性,例如destination说明了生成文件的位置。Package说明了生成hbm文件对应的java文件的所在包。GenXDocletTags说明了是否在hbm文件内部保留元数据标记。