学习hibernate实战(2),总结一下各种类映射选择的作用。
1、动态SQL生成
hibernate在启动的时候默认会为持久化类生成简单的SQL语句,如读取单个实体,删除单个实体,更新单个实体,保存单个实体。但是默认生成的insert和update是会包含这个持久化类的所有映射字段的。很多时候我们可能只是想更新某一个字段而已,若使用默认生成的update,则会将所有的字段都更新,没有改变的就使用旧值,这样很明显是影响性能的。
这里可以使用<class dynamic-insert="true" dynamic-update="true" >来告诉hibernate不默认生成SQL,而是根据字段是否为NULL或者字段是否被修改,来动态的生成SQL语句。
2、不可变实体类
有时候数据库的记录是不允许改变的,这个时候我们可以将记录对应的持久化类设置为不可变类,没有get/set方法,在构造函数中设值,配置文件的设置如下:
<class mutable="false" access="field">即设置了该类不允许update,属性访问不通过get/set,直接通过field。
3、声明包名称
下面这两种写法是等价的
<hibernate-mapping package="com.study.hbm" >
<class name="Message" table="MESSAGE">
<hibernate-mapping>
<class name="com.study.hbm.Message" table="MESSAGE">
4、使用衍生属性
衍生属性的值在运行时计算,通过利用formula属性定义的表达式求值。例如,可以把totalPrice属性映射到SQL表达式
<property name="totalPrice" formula="(select sum(o.price) from orders o where o.cid=cid)" />
5、组件映射
对象领域模型中,有一种是整体和部分的关系,比如User和Address之间的关系,关系领域中无法表示这种关系,hibernate可以利用组件映射的方式完成组件对象到关系表的映射。
<component name="address" class="com.hbm.address">
<component name="location" class="" >
<property name="" />
</component>
<property name="" />
</component>
上面的配置无法从address导航到user,通过添加parent=true,则可以从address导航到user,实现双向导航。
6、类映射方式
hibernate提供几种机制映射类到数据库表,<class>,<subclass>,<union-class>,<join-class>
7、值映射方式
对于简单的属性值,利用<property>映射表字段,类的值类型则利用<component>映射类的属性到表字段。