关系数据库学最重要的一个理论就是:不要给关键字赋予任何业务意义。因为只要赋予了业务意义,就有可能发生改变,将会为以后的数据库维护造成非常大的开销。
1、hibernate应用步骤
在java应用中,使用hibernate包括4步:
1)创建hibernate配置文件:hibernate-configuartion
2)创建实体类
3)创建对象/关系映射文件:hibernate-mapping
4)使用hibernate API编写访问数据库代码
1.1 创建hibernate配置文件
hibernate配置文件有两种格式,一种是properties格式,一种是xml格式。hibernate配置文件放置在java应用的classpath中。
1.2 创建实体类
创建的实体类要符合javaBean规范;hibernate不要求实体类一定要实现Serializable接口,但是如果采用分布式结构,java类要在不同进程间传递,需要要求实现该接口;hibernate要求持久化类必须实现一个带空参数的构造函数。
2、hibernate关系映射
2.1 访问级别
Java应用程序不能访问private类型的getXXX()和setXXX()方法,但是hibernate没有此限制,它能够访问任何访问级别的getXXX()和setXXX()方法。
2.2 基本类型属性和包装类型属性
hibernate既支持包装类型(如Long,Integer),也支持基本类型。对于持久化类的OID,推荐使用包装类型。这样可以通过持久化类的OID是否为空,判断持久化类的状态。
2.3 hibernate访问持久化类属性的策略
在<property>元素中的access属性用于指定hibernate访问持久化类的属性的策略,有两个值:
1)property:默认值。需要有相应的set方法和get方法。
2)field:当没有set方法或者get方法时指定该值,让hibernate直接访问属性。
2.4 在持久化类的访问方法中加入程序逻辑
1)在get方法和set方法中加入程序逻辑
例子:
public class Customer{
private String firstName;
private String lastName;
public Customer(){
}
public String getName(){
return firstName + “ “ + lastName;
}
public void setName(String name){
StringTokenizer toker = new StringTokenizer(name);
firstName= toker.nextToken();
lastName = toker.nextToken();
}
}
create table Customer(
id long not null primary key,
name varchar(100) not null
)
在以上的例子中,Customer类只有firstName和lastName属性,没有name属性,而数据库中只有name字段。所以在hibernate-mapping中应该使用<property name=”name” column=”name”/>进行映射。并且在HQL语句中,只能用name作为查询条件,而不能firstName和lastName作为查询条件。
2)控制insert语句和update语句
<property>和<class>元素中的属性可以控制insert语句和update语句,主要包括:
a)<property>中的insert:默认为true,如果为false,在生成的insert语句中不包含该字段,表明该字段永远不能为插入。
b)<property>中的update:默认为true,如果为false,在生成的update语句中不包含该字段,表明该字段永远不能为更新。
c)<class>中的mutable:默认为true,如果为false,默认所有<property>中的update为false。
d)<property>中的dynamic-insert:默认为false。如果为true,只有当该字段值不为null,才会把他包含在自动生成的insert语句中。
e)<property>中的dynamic-update:默认为false。如果为true,只有当该字段值不为null,才会把它包含在生成的update语句中。
f)<class>中的dynamic-insert:默认为false。
g)<class>中的dynamic-update:默认为false
hibernate生成动态sql的开销很小,所以如果表中包含很多字段,建议将dynamic-insert和dynamic-update字段都设置为true,减少数据库执行sql语句的开销。