字体大小: 正文
Hibernate笔记=>对象与关系的映射基础(2006-08-05 08:52:56)

映射的设计原则
对象的属性与关系数据库的字段,可以是一一对应,亦可以不是一一对应。在设计时,我们应该优先考虑前者,尽量保持每个属性在DB表中都有一个字段与其对应,这样既直观又简便。当然这不是绝对的,在以下情况可以考虑非一一对应模型:
1、项目不是从头开发的,现存的DB表结构与对象属性不一致时;
2、如果严格按一一对应,将会违反Object之间的面向对象设计原则时;
3、如果严格按一一对应,将会违反DB表的面向关系的对象设计原则时;
我想除了以上几种情况,在设计时还是要一一对应的比较好,我是肯定会这么做的。:)
 
 
属性映射策略
JavaBean要求每个属性通过Setter和Getter提供对外操作接口。尽管Hibernate具备直接映射JavaBean属性的能力,但是在Hibernate应用中,除非前文提到的万不得已的情况下,还是要优先考虑利用Setter和Getter来映射。好处是:
1、符合JavaBean的安全原则;
2、可以在setXXX和getXXX方法中加入必要的逻辑,使得持久化对象具备必要的逻辑;
3、便于持久化对象的升级维护。
 
Hibernate通过识别MappingXML中的<Property access="">来决定属性映射策略:
access="property"是默认值,映射时采用setXXX()和getXXX()来访问类的属性; 
access="field",映射时采用Java的反射机制直接访问类的属性。
 
 
类的包名的配置策略
关于设置类的包名,Hibernate提供这样的策略:
1、统一配置,适用于所有的持久化类都在同一个命名空间内。这样可以一次性简化配置
<hiberante-mapping package="com.wjb.mypack">
    <class name="Customer" table="CUSTOMERS">
        <!-- .... -->
    </class>
    <class name="Order" table="ORDERS">
        <!-- .... -->
    </class>
</hibernate-mapping>
2、分别配置,如果不满足以上的条件,则只能适用分别配置。
<hiberante-mapping >
    <class name="com.wjb.mypack.Customer" table="CUSTOMERS">
        <!-- .... -->
    </class>
    <class name="com.wjb.yourpack.Order" table="ORDERS">
        <!-- .... -->
    </class>
</hibernate-mapping>
 
 
DB的表明名的配置策略
<hibernate-mapping default-schema="MY">
    <class name="com.wjb.mypack.Customer" table="CUSTOMERS">
        <!-- .... -->
    </class>
</hibernate-mapping>
此时,Hibernate会把Customer类映射为表MY_CUSTOMERS.
当然除了配置策略外,Hibernate还提供了通过编码来实现设置命名策略。但这个功能很少被用到,因为在设计期间表名基本都是确定的。如果Hibernate应用中表有动态生成的,那么可以考虑通过编码策略来设置。
 
 
主键映射策略
关系数据库通过主键来标识同一表中的不同记录,Java/.net对象是按内存地址来标识同一个类的不同实例,Hibernate使用OID来建立内存中对象与数据库中表的记录的对应关系,即使对象的OID与表的主键一一对应。所以对象OID属性不应该被随意更改,在设计时最好让OID属性的setXXX()是private的,避免更改。
Hibernate中通过以下方式映射OID:
<hibernate-mapping default-schema="MY">
    <class name="com.wjb.mypack.Customer" table="CUSTOMERS">
        <id name="oid" type="long" column="COL_ID">
            <generator class="native">
        </id>
        <!-- .... -->
    </class>
</hibernate-mapping>
这样的话,Cusomter类应该如下
public class Customer{
    private Long oid;
    private void setOid(Long id){//avoid modify the oid property.
        this.oid = id;
    }
    public Long getOid(){
        return this.oid;
    }
}
注意这里的<generator class="native">,Hibernate通过它来提供主键生成策略。Hibernate提供了几种内置的OID生成器,如下:
increment|identity|sequence|hilo|uuid.hex|assigned|native
关于以上几个生成器,在Hibernate的文档中有详细说明,在此不再重复了。根据DB供应商不同来决定用哪个策略。但是有一个不同的就是native,它是依据底层数据库对自动生成ID的支持能力,来选择使用identity、sequence、hilo的。如:MySQL和MSSQLServer就会选择identity;Oracle就会选择sequence。所以在大部分应用中使用native即可,而不用过多的研究其细节。
关于复合主键,Hibernate也同样提供支持,如下配置。
<hibernate-mapping default-schema="MY">
    <class name="com.wjb.mypack.Customer" table="CUSTOMERS">
        <composite-id>
            <key-property name="name" column="NAME"/>
            <key-property name="company" column="COMPANY_NAME"/>
        </composite-id>
        <!-- .... -->
    </class>
</hibernate-mapping>
这个配置为name和company的复合主键的映射,对一般的应用来说,这种情况不常用,所以就不详细讨论了。
 




其他相关文章

Hibernate组成关系的映射
Hibernate批量更新和删除问题
Hibernate缓存技术
Hibernate Java/.net对象的状态
Hibernate Session缓存
Hibernate 检索策略
Hibernate 检索相关细节问题
Hibernate 继承关系的映射
Hibernate 一对多关系的映射
Hibernate 对象与关系的映射基础
Hibernate跑起来
Hibernate的核心接口

 

加载中,请稍候...
  • 评论加载中,请稍候...
发评论    心动开奖分秒有礼物

验证码:请点击后输入验证码  收听验证码

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

相关博文
读取中...
推荐博文
读取中...