1.下载Hibernate-middlegen
打开http://sourceforge.net/projects/hibernate/files/
2.安装 middlegen
将1下载的文件解压缩至c盘。解压后目录结构是 C:/Middlegen-Hibernate-r5
3.Middlegen-Hibernate-r5的配置
① 把数据库驱动程序ojdbc14.jar放到C:/Middlegen-Hibernate-r5/lib目录下。
② 配置数据参数 C:/Middlegen-Hibernate-r5/config/database/oracle.xml
<!-- =================================================================== -->
<!-- ant properties/targets for oracle 8/9 -->
<!-- note: this is not a proper xml file (there is no root element) -->
<!-- it is intended to be imported from a *real* xml file -->
<!-- =================================================================== -->
<!-- please set your Oracle-SID according to your needs -->
<property environment="env"/>
<property name="database.script.file" value="${src.dir}/sql/${name}-oracle.sql"/>-->自带 sample表生成用sql。根据具体情况可替换成自己的,或者删除。
<property name="database.driver.file" value="ojdbc14.jar"/>--->指定驱动程序
<property name="database.driver.classpath" value="C:/Middlegen-Hibernate-r5/lib/"/>
<property name="database.driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="database.url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"/> ---> URL
<property name="database.userid" value="xiehl"/> -->用户名
<property name="database.password" value="0455"/> -->密码
<property name="database.schema" value="XIEHL"/> -->schema
<property name="database.catalog" value=""/>
<!--property name="jboss.datasource.mapping" value="Oracle7"/-->
<property name="jboss.datasource.mapping" value="Oracle10g"/> -->oracle版本设定
<!--property name="jboss.datasource.mapping" value="Oracle9i"/-->
注意问题1:
在oracle中要指定 <property name="database.schema" value="username"/>如未指则在生成时会出问题.value值和database.userid值一样。
如未指定schema,则会有以下错误。
注意问题2:
如果未删除oracle10g中的垃圾表如"BINjR8PK5HhrrgMK8KmgQ9nw== "见分则会出现如下错误:
D:Middlegen-Hibernate-r5build.xml:148: middlegen.MiddlegenException: Database
problem:ORA-01424: 转义符之后字符缺失或非法
问题解决办法:删除oracle10g中的垃圾表然后再按生成步骤进行,删除oracle10g中的所有垃圾表见文章如
http://blog.youkuaiyun.com/inber/archive/2006/07/22/958372.aspx
好像这篇博文的SQL语句不对 我做了稍微的修改
删除oracle10g中的所有垃圾表见文章
http://blog.youkuaiyun.com/glacialdrift/article/details/8125781
4.配置middlegen跟目录下的build.xml
build.xml是Middlegen-Hibernate的ant构建配置。Middlegen-Hibernate将根据build.xml文件中的具体参数生成数据库表映射文件。可配置的项目包括:
①目标数据库配置文件地址
查找关键字"!ENTITY",得到
<!DOCTYPE project [
<!ENTITY database SYSTEM "./config/database/hsqldb.xml">
]>
将其改成自己的数据库配置文件地址
<!DOCTYPE project [
<!ENTITY database SYSTEM "./config/database/oracle.xml">
]>
② Application Name
查找 <property name="name" value="airline"/>
改成自己希望的名字
<property name="name" value="HibernateSample"/>
③ 输出目录
查找关键字 "name="build.gen-src.dir"",得到<property name="build.gen-src.dir" value="${build.dir}/gen-src"/>
修改value使其指向我们自己的目录。根据需要也可不改。
④ 对应代码的package name
查找关键字 destination,得到
<hibernate
destination="${build.gen-src.dir}"
package="${name}.hibernate"
genXDocletTags="false"
genIntergratedCompositeKeys="false"
javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"
/>
根据需要将其改成自己的。
<hibernate
destination="${build.gen-src.dir}"
package="jp.co.xiehl.domain"
genXDocletTags="true"
genIntergratedCompositeKeys="false"
javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"
/>
这里还有一个属性genXDocletTags,如果设置为true,则生成的代码将包含xdoclet tag,这为以后在开发过程中借助xdoclet进行映射调整提供了帮助。
注意
如果数据库是sqlserver,则需要将build.xml中如下部分删除,否则Middlegen会报出找不到表的错误。
<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}"
schema="${database.schema}" ---------> sqlserver时,删除
catalog="${database.catalog}" ---------> sqlserver时,删除
>
至此,hibernate的配置完毕。
5.运行ant,启动Middlegen GUI界面
启动dos界面,进入C:/Middlegen-Hibernate-r5根目录。
运行ant,即可看到GUI界面。
进入Middlegen的GUI界面后,可以看到,数据库中的表结构已经导入到MiddleGen的操作界面中,选定数据库表视图中的表元素,我们即可调整各个数据库表的属性。
-
主键生成器
可选项说明:
①assigned.主键由外部程序生成,无需Hibernate参与。
②hilo 通过hi/lo算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
③seqhilo 与hilo类似,通过hi/lo算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如
Oracle。
④increment 主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键
的时候将此值加1作为主键。
这种方式可能产生的问题是,如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能产生相同主键,
从而造成主键重复异常。因此,同一数据库有多个实例访问,此方式必须避免使用。
⑤identity 采用数据库提供的主键生成机制。如 DB2,sql server,Mysql中的主键生成机制。
⑥sequence 采用数据库提供的sequence机制生成主键。如oracle中的sequence机制。
⑦native 由Hibernate根据底层数据库自行判断采用identity,hilo,sequence其中一种作为主键生成方式。
⑧uuid.hex 由Hibernate基于128位唯一值产生算法生成16进制数值(编码后以长度32的字符串表示)作为主键。
⑨uuid.string 与uuid.hex类似,只是生成的主键未进行编码(长度16).在某些数据库中可能出现问题(如PostgreSQL)。
⑩foreign 使用外部表的字段作为主键。
一般而言,使用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。
另外,由于常用的数据库,如oracle,DB2,SqlServer,MySql等,都提供了易用的主键生成机制(auto-Increase字段或者sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
3.key-generator后面的可输入部分。 如果需要采用定制的主键产生算法,则在此处配置主键生成器,主键生成器必须实现net.sf.hibernate.id.IdentifierGenerator接口。
4.Schema Name 数据库Schema Name
5.Persister 自定义持久化实现类类名。如果系统中还需要Hibernate之外的持久层实现机制,如通过存储过程得到目标数据集,甚至从
-
LDAP中获取数据来填充我们的POJO。
6.Enable proxies 是否使用代理(用于延迟加载[Lazt Loading])
7.Dynamic Update 如果选定,则生成UPDATE SQL时不包含未发生变动的字段属性,这样可以在一定程度上提升sql执行效能。
8.Mutable 类是否可变,默认为选定(可变)。如果不希望应用程序对此类对应的数据进行修改(如对于数据库视图),则可取消其选定状态,
之后对此类的delete和update都将失效。
9.Lifestyle interface 是否实现lifestyle接口。lifestyle接口提供了数据固化过程中的控制机制,通过实现该接口,
我们可以在数据库操 中加入回调机制,如在数据库操作之前,之后触发指定操作。
10.Validatable interface 是否实现Validatable 接口。通过实现Validatable 接口,我们可以在数据被固化到数据库表之前对
其合法性进行验证。
要注意的是,通过实现lifestyle接口,同样可以在数据库操作之前进行合法性验证。不同的是,Validatable 接口中定义的方法
可能会被多次调用,因此设计中应避免在Validatable 接口的validate方法的实现中加入业务逻辑的验证。
以上是针对class的设置。
同样,可对字段进行类似设置。
设置好后,点击gui上部的Generate即可生成我们需要的xml映射文件。
D:Middlegen-Hibernate-r5build.xml:148: middlegen.MiddlegenException: Middlegen
successfully connected to the database, but couldn't find any tables. Perhaps t
he specified schema or catalog is wrong? -Or maybe there aren't any tables in th
e database at all?
Configured schema:
Configured catalog:
Available schemas:
ANONYMOUS
CTXSYS
...
Available catalogs:
解决办法是按照以上方法正确配置schema及其他项目。
,Middlegen: 从数据库中已有 的表结构中生成Hibernate映射文 件。当前版本是2.1可以去 http://boss.bekk.no/boss/middlegen下载。