一、hibernate访问持久化类属性的策略
  在<property>元素中的access属性用于指定Hibernate访问持久化类属性的方式。
  常见的方式如下
    1、property:默认值。hibernate通过相应的getXXX()和setXXX()方法。
    2、field:hibernate运用反射机制直接访问类的属性。
    3、自定义方式:自己写一个实现org.hibernate.property.PropertyAccessor接口的类,在access属性中写类的全限定名。

  举例:

<property name="name" access="property"/>
<property name="name" access="field"/>
<property name="name" access="com.test.MyPropertyAccessor"/>

二、在持久化类的访问方法中加入程序逻辑
  可以在getXXX()或者setXXX()中加入逻辑,完成一些相关的操作。此种方式要求access属性值为property。
三、设置派生属性
  有时候持久化类的属性不能直接和表的字段匹配,这些属性的值需要在运行时通过计算才能计算出来(在数据库端计算,否则可以通过上述方法二解决),这种属性即为派生属性。
  可以通过<property>元素的formula属性解决。
  示例:

<property name="totalPrice" formula="(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID"/>

  说明:上面的ID,必须是Customer.hbm.xml中定义的property,否则无法访问。
四、控制insert和update语句
  在Hibernate初始化时,会根据映射文件,为持久化类生成对应的SQL语句。默认情况下,预定义的SQL语句中包含了表中所有的字段。若要显式的指定不包含某些字段,使用下面的配置即可:

<property name="price" update="false" column="PRICE"/>

上面的配置表明在update语句中不会包含PRICE字段。

其余可配置的类似属性有:

<property>元素的insert:如果为FALSE,则该字段永远不能被插入。
<property>元素的update:如果为FALSE,则该字段永远不会被更新。
<class>元素的mutable:如果为FALSE,等价于所有的property元素的update属性为FALSE。
<class>元素的dynamic_insert:如果为TRUE,表明当保存一个对象时,会动态生成insert语句,仅会包含所有取值不为null的字段。
<class>元素的dynamic_update:如果为TRUE,表明当更新一个对象时,会动态生成iupdate语句,仅会包含所有取值需要更新的字段。

五、创建命名策略
  命名策略的目的是告知Hibernate如何把配置文件解析为对应的SQL语句,涉及表名的解析、属性名的解析。
  Hibernate提供了两个默认的实现类:

org.hibernate.cfg.DefaultNamingStrategy:默认的命名策略。
org.hibernate.cfg.ImprovedNamingStrategy:高级命名策略。

  可以通过继承上述类进行扩展。
  其中常用的方法如下:

public String classToTableName(String className);
public String propertyToColumnName(String propertyName);
public String tableName(String tableName);
public String columnName(String columnName);
public String propertyToTableName(String className, String propertyName);

使自定义命名策略生效的方式:

Configuration config = new Configuration()
.setNamingStrategy( new MyNamingStrategy() )
.configure();
SessionFactory sessionFactory = config.buildSessionFactory();

六、设置数据库的Schema
  涉及多个Schema中的同名表时的解决方案。
  可以在<hibernate-mapping schema="schema1">中设置,也可以在<class name="mypack.Order" table="ORDERS" schema="schema2"/>中设置,class中定义的会覆盖Hibernate-mapping中定义的。
七、设置类的包名
  默认情况下,在设置<class>元素的name属性时,必须提供完整类名。
  简化方式是在 <hibernate-mapping package="mypack"/>中定义。


声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。

攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等的更多相关文章

  1. 攻城狮在路上(壹) Hibernate(十六)--- Hibernate声明数据库事务

    一.数据库事务的概念: 数据库的ACID特征:Atomic.Consistency.Isolation.Durability.原子性.一致性.隔离性.持久性.不同的隔离级别引发的不同问题. 事务的AC ...

  2. 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合

    一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...

  3. 攻城狮在路上(壹) Hibernate(八)--- 映射Hibernate组成关系

    一.使用组成关系的原则: 在不导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系,因为建立多个表的连接是很耗时的操作. 举例说明:Customer类中的Address属性,可以通过组 ...

  4. 攻城狮在路上(壹) Hibernate(六)--- 通过Hibernate操纵对象(上)

    一.Hibernate缓存简介: Session接口是Hibernate向应用程序提供的操纵数据接口的最主要接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个缓存, ...

  5. 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序

    1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...

  6. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

  7. 攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题

    一.多个事务并发运行时的并发问题: 总结为第一类丢失更新.脏读.虚读.不可重复读.第二类丢失更新. 1.第一类丢失更新: 撤销一个事务时,把其他事务已提交的更新数据覆盖. 2.脏读: 一个事务读到另一 ...

  8. 攻城狮在路上(壹) Hibernate(十五)--- Hibernate的高级配置

    一.配置数据库连接池: 1.使用默认的数据库连接池: Hibernate提供了默认了数据库连接池,它的实现类为DriverManegerConnectionProvider,如果在Hibernate的 ...

  9. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

随机推荐

  1. struts2将servlet对象注入到Action中

    在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口: a. ServletRequestAware: 实现该接口的Action可以直接 ...

  2. 转:SQL子句的执行顺序

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  3. Arp攻击实战

    hyddd原创,转载请说明出处. 现在网上很多关于ARP攻击的文章,但多数是描述其原理,少数会以某个工具作为例子展开说明,但感觉说的还是不够详细,今天写个文章以实战介绍一个叫"WinArpA ...

  4. (转) Lambda表达式中的表达式lambda和语句lambda区别

    Lambda表达式可分为表达式lambda和语句lambda 表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda (input parameters) = ...

  5. Linux安装字体

    用惯了Win7的字体,感觉雅黑看着很舒服,就动手在Linux安装下,简单描述下: 第一步:百度一下,找到微软雅黑字体(.ttf)下载 第二步:把下载的字体放到cd /usr/share/fonts/z ...

  6. Centos 用户登录失败N次后锁定用户禁止登陆

    针对linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁 Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁 ...

  7. Effective C++ -----条款31:将文件间的编译依存关系降至最低

    支持“编译依存性最小化”的一般构想是:相依于声明式,不要相依于定义式.基于此构想的两个手段是Handle classes 和 Interface classes. 程序库头文件应该以“完全且仅有声明式 ...

  8. 【leetcode】Isomorphic Strings(easy)

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  9. 【linux】配置SSH免密码登陆

    1.输入ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 其中''里的是登陆的密码,因为要设置免密码,所以''里是什么都没有的,空格也不行 2.输入 cat ~/.ss ...

  10. 【编程之美】CPU

    今天开始看编程之美 .第一个问题是CPU的使用率控制,微软的问题果然高大上,我一看就傻了,啥也不知道.没追求直接看答案试了一下.发现自己电脑太好了,4核8线程,程序乱飘.加了一个进程绑定,可以控制一个 ...