科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Hibernate项目中工具箱指南(4)

Hibernate项目中工具箱指南(4)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

15.2.3. 基本的finder生成器(Basic finder generator)

作者:中国IT实验室 来源:中国IT实验室 2007年8月21日

关键字: Hibernate

  • 评论
  • 分享微博
  • 分享邮件

15.2.3. 基本的finder生成器(Basic finder generator)

目前可以让hbm2java为Hibernate属性生成基本的finder。这需要在hbm.xml文件中做两件事情。

首先是要标记出你希望生成finder的字段。你可以通过在property标签中的meta 块来定义:

<property name="name" column="name" type="string">
<meta attribute="finder-method">findByName</meta>
</property>

find方法的名字就是meta标签中间的文字。

第二件事是为hbm2java建立下面格式的配置文件:

<codegen>
<generate renderer="net.sf.hibernate.tool.hbm2java.BasicRenderer"/>
<generate suffix="Finder" renderer="net.sf.hibernate.tool.hbm2java.FinderRenderer"/>
</codegen>

然后用参数去调用:hbm2java --config=xxx.xml,xxx.xml就是你刚才创建的配置文件的名字。

有个可选的参数,作为一个在class级别的meta标签,格式如下:

<meta attribute="session-method">
com.whatever.SessionTable.getSessionTable().getSession();
</meta>

他是用来管理你如何使用Thread Local Session模式(在Hibernate 网站的Design Patterns部分有文档)得到session的。

15.2.4. 基于Velocity的渲染器/生成器(Velocity based renderer/generator)

目前可以使用velocity作为渲染机制的一个替代方案。下面的config.xml文件显示了如果配置hbm2java来使用velocity渲染器。

    <codegen>
<generate renderer="net.sf.hibernate.tool.hbm2java.VelocityRenderer">
<param name="template">pojo.vm</param>
</generate>
</codegen>

名为template的参数是指向你希望你使用velocity macro文件的资源路径。这个文件必须在hbm2java的classpath中。所以要记住把pojo.vm所在的路径加入到你ant任务或者shell脚本中去。(默认的位置是./tools/src/velocity)

注意,当前的pojo.vm只生成java beans最基本的部分。他还没有默认的渲染器那么完整,也没有那么多功能——特别是大部分meta标签还不支持。

15.3. 映射文件生成器(Mapping File Generation)

    映射文件的骨架可以从编译过的持久化类中使用MapGenerator工具生成。这工具是Hibernate Extensions发行包的一部分。

    Hibernate映射生成器提供了从编译过的类中产生映射的机制。他使用Java反射来查找属性( properties),然后使用启发式算法来从属性类型猜测合适的映射。生成出来的映射文件之应该看作是后续工作的起点。没有办法在没有用户修正的情况下生成完整的Hibernate映射。但是,这个工具还是替你做了很多非常琐碎和麻烦的工作。

   类一个一个地加入到映射去。如果工具认为某个类不是Hibernate可持久化( persistable)的,就会把这些类剔除。

判断是否是Hibernate可持久化( persistable)的原则是:

  • 必定不是一个原始类型

  • 必定不是一个数组

  • 必定不是一个接口

  • 必定不是一个内部类

  • 必定有一个默认的无参数的构造方法。

注意,接口和内部类实际上是可以通过Hibernate持久化的,但是一般来说用户不会使用。

    对已经发现的类,MapGenerator会重复回溯到超类链条上去,以尽可能的把Hibernate可持久化的超类加入到对同一个数据库表的映射去。如果回溯过程中某个类出现了有个属性在下列备选UID名字(candidate UID names)名单中,回溯就会停止。

默认的备选UID属性名有:uid, UID, id, ID, key, KEY, pk, PK。

    如果类中有两个方法,一个是setter,一个是getter,并且setter的单参数的属性和getter的无参数返回值得类型相同,并且setter返回void,就认为发现了一个属性。并且,setter的名字必须以set字符串开始,getter的名字必须以get开始,或者以is开始并且属性类型是boolean。在上面的情况发生时,get和set之后的名字还必须匹配。这个匹配就是属性的名字,然后如果第二个字母是小写的话,会把其首字母变成小写。

用来决定每个属性的数据库类型的规则如下:

  1. 如果Java类型是Hibernate.basic(),则属性是该类型的一个普通字段。

  2. 对于hibernate.type.Type特定类型和PersistentEnum来说,也会使用一个普通字段。

  3. 如果属性类型是一个数组,那么会使用一个Hibernate数组,并且MapGenerator试图反映数组元素的类型。(attempts to reflect on the array element type.)

  4. 如果属性是java.util.List,java.util.Map或者java.util.Set,会使用对应的Hibernate类型,但是MapGenerator不能对这些类型进行进一步处理了。

  5. 如果属性的类型不是上面任何一种,MapGeneraotr把决定数据库类型的步骤留待所有的类都被处理之后再来做。在那时候,如果类在上面描述过的超类搜索过程中被发现了,这个属性会被认为是一个many-to-one的关联。如果类有人和属性,它则是一个组件(component)。否则它就是可序列化的(serializable),或者不是可持久化的。

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章