Hibernate(二)

1. The mapping file

        Hibernate需要知道如何装载和存储持久类的对象。Hibernate的映射文件正是用来告诉hibernate可以访问数据库中的哪个表,以及这个表中的哪些列可以被使用。一个映射文件的基本结构如下:

<?xml version="1.0"?><--文件头-->
   
   
<!DOCTYPE hibernate-mapping PUBLIC
  
  
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  
  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  
  
<hibernate-mapping>
  
  
[...]
  
  
</hibernate-mapping>
  
   
  
  

    注意到hibernate DTD文件是非常复杂的。用它们可以使你在xml的编辑工具或你的IDE中自动完成xml的映射元素和属性。也可以在编辑工具中打开这些DTD文件――这也是最简单的浏览所有元素和属性以及默认值,及一些注释的方法。注意,hibernate并不是从web站点去装载这些DTD文件,而是先从classpath中去寻找。这些DTD文件包含在hibernate3.jar文件中,位于hibernate发布文件的src目录下。

    在以后的例子中为了使代码简短,我们将省略DTD文件声明部分。

<hibernate-mapping>
  
  
    <class name="events.Event" table="EVENTS">
  
  
    </class>
  
  
   
    
  
  
</hibernate-mapping>
  
  
   如上,classname属性指定hibernate的持久化类,它的格式包括了完整的类名(即包名.类名)。Table属性指定了与Event类对应的数据库中的表名(即EVENTS表)。
   
   
   到目前为止,我们已经告诉hibernate如何用Event类的对象来持有EVENTS表,每个Event类的实例代表了表中的一行记录。
   
    
  
  

接下来我们继续用一个唯一的表示属性来对应表中的主键。另外,我们不关心如何操作这个唯一的表示符,因此我们将hibernate的标识符生成策略配置为如下:

<hibernate-mapping>
  
  
    <class name="events.Event" table="EVENTS">
  
  
        <id name="id" column="EVENT_ID">
  
  
            <generator class="native"/>
  
  
        </id>
  
  
    </class>
  
  
</hibernate-mapping>
  
   
  
  

    Id元素是对标识属性的声明,name = “id”是对java类属性的声明。Hibernate将会调用gettersetter方法来访问这个属性。Column属性表明这个属性代表的是EVENTS表的主键列,即EVENTS_ID列。接下来的generator元素指定了标识符的生成策略,在这里我们用的是native策略,这个策略依据配置的数据库的类型自动选择最优的策略来生成主键。(比如:sql server会采用自动增长的方式,oracle会采用sequnence的方式来生成主键)。Hibernat还支持其他的几种主键生成方式。
 

    最后,在映射文件中加入对类的持久化属性的声明。如下:

<hibernate-mapping
  
  
    <class name="events.Event" table="EVENTS">
  
  
        <id name="id" column="EVENT_ID">
  
  
            <generator class="native"/>
  
  
        </id>
  
  
        <property name="date" type="timestamp" column="EVENT_DATE"/>
  
  
        <property name="title"/>
  
  
    </class>
  
  

  
  
   
    
  
  
</hibernate-mapping>
  
   
  
  

    id元素一样,这行属性元素的name值将告诉hibernate该调应哪些gettersetter函数。因此,在这里,hibernate将寻找getDate()和setDate(),getTitle()/setTitle();

    注意到date属性元素中包含了colunm值,但是title却没有。如果没有指定与该属性对应的表中的列的名称,即没有指定column,默认使用和列名和属性名一样。

    同样注意到title属性映射时还缺少type字段,在映射文件中使用的type字段,并不是指java中的数据类型,也不是数据库的类型。这些类型叫做hibernate映射类型,转换器可以将java的类型转换为数据库的类型,反之亦然。如果没有指定type字段的话,hibernate会自动决定采用正确的转换器和映射类型。在某些情况下这种自动转换决定可能达不到预期的效果。对于date属性就存在着这样的问题。Hibernate不知道应该将这个属性映射为SQLdate类型,timestamp还是time类型。为保证完整的信息,我们把它映射为timestamp转换器。
  

    这个映射文件应该被保存为Event.hbm.xml,并和Event类放于同一个目录下。

.
  
  
+lib
  
  
  <Hibernate and third-party libraries>
  
  
+src
  
  
  +events
  
  
    Event.java
  
  
    Event.hbm.xml
  
  
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值