Hibernate对象-关系映射

1.持久化类

持久化类使用JavaBean风格,为需要被访问的属性提供getter和setter方法。

Java应用程序不能访问持久化类的private类型的getter和setter方法,Hibernate无此限制,可以访问各种访问级别的getter、setter方法。

1.1.基本类型和包装类型

Java有8种基本类型:byte、short、char、int、long、float、double和boolean,

对应8种包装类型:Byte、Short、Character、Integer、Long、Float、Double和Boolean。

在持久化类中,既可以把属性定义为基本类型,也可以定义为包装类型,它们对应相同的Hibernate映射类型,

eg. 不管price属性是double还是Double类型,均采用以下映射方式:

<property name="price" type="double" column="PRICE"/>

基本类型的缺点在于无法表达null值。

包装类型都是Java类,默认值是null。

在SQL中,所有数据;类型的默认值都是null,Java包装类型与SQL数据类型之间具有更直接的对应关系。

Hibernate既支持包装类型,也支持基本类型。

1.2.Hibernate访问持久化类属性的策略

<property>元素的access属性用于指定Hibernate访问持久化类的属性的方式:

property:默认值,表明Hibernate通过相应的getter、setter方法访问类的属性。

filed:表明Hibernate运用Java反射机制直接访问类的属性

eg. 若Customer类没有为name属性提供setName()和getName()方法,就可以把access设为field,使Hibernate能够直接访问name属性:

<property name="name" column="NAME" access="filed"/>

1.3.在持久化类的访问方法中加入程序逻辑

eg. 在Customer类中有firstName和lastName属性,但没有name属性,而在数据库中只有NAME字段:

private String firstName;

private String lastName;

public String getName(){

    return firstName + " " + lastName;

}

public void setName(String name){

    StringTokenizer t = new StringTokenizer(name);

    firstName = t.nextToken();

    lastName = t.nextToken();

}

<property name="name" column="NAME" />

不管在Customer类中有没有name属性,只要在Customer.hbm.xml文件中映射了name属性,在程序中就能够访问它。

1.4.设置派生属性

持久化类的有些属性的值必须在运行时通过计算才能得出,这种属性成为派生属性。

这种属性可以在setter中加入程序逻辑进行设置,也可以利用<property>元素的formula属性设置,formula属性用来设置一个SQL表达式,Hibernate根据它来计算出派生属性的值。

eg. 

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

1.5.控制insert和update语句

<property>元素的insert属性:默认为true,若为false,在insert语句中不包含该字段,表明该字段永远不会被插入;

<property>元素的update属性:默认为true,若为false,在update语句中不包含该字段,表明该字段永远不会被更新;

<class>元素的mutable属性:默认为true,若为false,等价于所有的<property>元素update属性值为false,表明整个实例不会被更新;

<class>元素的dynamic-insert属性:默认为false,若为true,表示当保存一个对象时,会动态生成insert语句,insert语句中仅包含所有取值不为null的字段;

<class>元素的dynamic-update属性:默认为false,若为true,表示当更新一个对象时,会动态生成update语句,update语句中仅包含所有取值需要更新的字段。

如果表中包含许多字段,建议把dynamic-insert和dynamic-update属性设为true,在insert和update语句中就只包含需要插入或更新的字段,这可以节省数据库执行SQL的时间,从而提高应用的运行性能。

2.处理SQL引用标识符

在SQL语法中,标识符是指用于为数据库表、视图、字段或索引等命名的字符串。

如果数据库表名或字段名中包含空格,或者包含特殊字符,那么可以使用引用标识符。

MySQL中,应用标识符的形式为'IDENTIFIER NAME'。

eg. CUSTOMERS表中有一个字段'CUSTOMER DESCRIPITION'

create table CUSTOMERS(..., 'CUSTOMER DESCRIPITION' text);

<property name="descripition" column="'CUSTOMER  DESCRIPITION'" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值