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'" />