攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等...

一、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对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。

转载于:https://www.cnblogs.com/tq03/p/3744087.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值