风行天下

JAVA太极
posts - 4, comments - 10, trackbacks - 0, articles - 55
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

所需工具: hibernate-2.1Hibernate-extensionMiddlegen-Hibernate

1.    映射(.*hbm)文件的生成

1.1 在数据库中建表;

1.2 Middlegen-Hibernate中配置数据库连接文件及输出目录:

配置数据库验证文件:

(红色部分为配置修改部分)

D:\Middlegen-Hibernate-r5\config\database\oracle.xml

  

  

              value="${src.dir}/sql/${name}-oracle.sql"/>

            value="D:\oracle\ora90/jdbc/lib/classes12.jar"/>

    value="${database.driver.file}"/>

           value="oracle.jdbc.driver.OracleDriver"/>

                      value="jdbc:oracle:thin:@172.18.11.243:1521:JavaTest"/>

           value="SecureAssess"/>

         value=" SecureAssess "/>

           value=" SecureAssess "/> 

               value=""/>

property name="jboss.datasource.mapping"   value="Oracle7"/-->

property name="jboss.datasource.mapping"   value="Oracle8"/-->

  name="jboss.datasource.mapping"     value="Oracle9i"/>

: database.url--数据库连接串

    database.schema数据库的命名空间

 

D:\Middlegen-Hibernate\builder.xml

(1)指定我们配置好的数据库验证文件

    oracle.xml">

]>

           value="d:samples "/>

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

     package="org.hibernate.sample"//在指定输出目录中生成文件包

     genXDocletTags="true"//在生成的.*hbm文件中包含DocletPOJO使用

            genIntergratedCompositeKeys="false"        javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"

         />

配置完毕,在MiddleGen 根目录下运行ant,就将出现MiddleGen的界面,依据需要对表进行设计.

可以看到,数据库中的表结构已经导入到MiddleGen 的操作界面中,选定数据库

表视图中的表元素,我们即可调整各个数据库表的属性。

★ Domain Class Name

对应POJO 的类名

★ Key Generator

主键产生器

可选项说明:主键由外部程序负责生成,无需Hibernate参与。

2) hilo

通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。

3) seqhilo

hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

4) increment

主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。

这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实例访问,此方式必须避免使用。

5) identity

采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL

中的主键生成机制。

6) sequence

采用数据库提供的sequence 机制生成主键。如Oralce 中的Sequence。

7) native

Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

8) uuid.hex

Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

9) uuid.string

uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。

10) foreign

使用外部表的字段作为主键。一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状

态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之

后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据

库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生

了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。

★3 如果需要采用定制的主键产生算法,则在此处配置主键生成器,主键生成器必须实现net.sf.hibernate.id.IdentifierGenerator 接口。

★4 Schema Name

数据库Schema Name。

★5 Persister

自定义持久类实现类类名。如果系统中还需要Hibernate 之外的持久层实现机制,如通过存储过程得到目标数据集,甚至从LDAP中获取数据来填充我们的POJO。

★6 Enable proxies

是否使用代理(用于延迟加载[Lazy Loading])。

★7 Dynamic Update

如果选定,则生成Update SQL 时不包含未发生变动的字段属性,这样可以在一定程度上提升SQL执行效能。

★8 Mutable

类是否可变,默认为选定状态(可变)。如果不希望应用程序对此类对应的数据记录进行修改(如对于数据库视图),则可将取消其选定状态,之后对此类的Delete和Update操作都将失效。

★9 Implement the Lifecyle interface

是否实现Lifecyle接口。Lifecyle接口提供了数据固化过程中的控制机制,通过实现Lifecyle接口,我们可以在数据库操作中加入回调(Call Back)机制,如在数据库操作之前,之后触发指定操作。

★10 Implement the Validatable interface

是否实现Validatable接口。通过实现Validatable接口,我们可以在数据被

固化到数据库表之前对其合法性进行验证。值得注意的是,通过实现Lifecyle接口,我们同样可以在数据操作之前验证数据合法性,不同的是,Validatable 接口中定义的validate 方法可能会被调用多次,因此设计中应避免在Validatable 接口的validate 方法实现中加入业务逻辑的验证。

 

2.    POJO文件的生成

POJO 的生成工作可以通过Hibernate Extension 来完成,Hibernate Extension 的

tools\bin目录下包含三个工具:

★ hbm2java.bat

根据映射文件生成对应的POJO。通过MiddleGen 我们已经得到了映射文件,

下一步就是通过hbm2java.bat工具生成对应的POJO。

★ class2hbm.bat

根据POJO class 生成映射文件,这个工具很少用到,这里也就不再详细介绍。

★ddl2hbm.bat

由数据库导出库表结构,并生成映射文件以及POJO。这个功能与MiddleGen的功能重叠,但由于目前还不够成熟(实际上已经被废弃,不再维护),提供的功能也有限,所以我们还是采用MiddleGen生成映射文件,之后由hbm2java根据映射文件生成POJO 的方式。为了使用以上工具,首先我们需要配置一些参数,打开D:\Hibernate-extension\tools\bin\setenv.bat 文件,修改其中JDBC_DRIVER和HIBERNATE_HOME环境变量,使其指向我们的实际JDBC Driver文件和Hibernate所在目录,如

set JDBC_DRIVER=c:\mysql\mysql.jar

set HIBERNATE_HOME=c:\hibernate

同时检查一下环境变量CP中的各个项目中是否实际存在,特别是%CORELIB%下的jar文件,某些版本的发行包中,默认配置中的文件名与实际的文件名有所出入(如%CORELIB%\commons-logging.jar, 在Hibernate 发行包中,可能实际的文件名是commons-logging-1.0.3.jar,诸如此类).

配置文件如下:

@echo off

rem -------------------------------------------------------------------

rem Setup environment for hibernate tools

rem -------------------------------------------------------------------

set JDBC_DRIVER=D:\oracle\ora90\jdbc\lib\classes12.jar

set HIBERNATE_HOME=D:\hibernate-2.1

set HIBERNATETOOLS_HOME=D:\Hibernate-extension\tools

echo HIBERNATETOOLS_HOME set to %HIBERNATETOOLS_HOME%

if "%HIBERNATE_HOME%" == "" goto noHIBERNATEHome

set CORELIB=%HIBERNATE_HOME%\lib

set LIB=%HIBERNATETOOLS_HOME%\lib

set CP=%CLASSPATH%;%JDBC_DRIVER%;%HIBERNATE_HOME%\hibernate2.jar;%CORELIB%\commons-logging-1.0.4.jar;%CORELIB%\commons-lang-1.0.1.jar;%CORELIB%\cglib-full-2.0.2.jar;%CORELIB%\dom4j-1.4.jar;%CORELIB%\odmg-3.0.jar;%CORELIB%\xml-apis.jar;%CORELIB%\xerces-2.4.0.jar;%CORELIB%\xalan-2.4.0.jar;%LIB%\jdom.jar;%CORELIB%\commons-collections-2.1.1.jar;%LIB%\..\hibernate-tools.jar

if not "%HIBERNATE_HOME%" == "" goto end

:noHIBERNATEHome

echo HIBERNATE_HOME is not set. Please set HIBERNATE_HOME.

goto end

:end

 

使用hbm2java,根据MiddleGen生成的映射文件生成Java 代码:打开Command Window,在D:\Hibernate-extension\tools\bin目录下执行:

hbm2java d:\samples\org\hibernate\sample\*.xml --output=d:\samples\


只有注册用户登录后才能发表评论。


网站导航: