关系数据库学最重要的一个理论就是:不要给关键字赋予任何业务意义。由于只要赋予了业务意义,就有可能发生改变,将会为之后的数据库维护形成很是大的开销。 java
一、hibernate应用步骤 sql
在java应用中,使用hibernate包括4步: 数据库
1)建立hibernate配置文件:hibernate-configuartion app
2)建立实体类 分布式
3)建立对象/关系映射文件:hibernate-mapping 函数
4)使用hibernate API编写访问数据库代码 spa
1.1 建立hibernate配置文件 hibernate
hibernate配置文件有两种格式,一种是properties格式,一种是xml格式。hibernate配置文件放置在java应用的classpath中。 xml
1.2 建立实体类 对象
建立的实体类要符合javaBean规范;hibernate不要求实体类必定要实现Serializable接口,可是若是采用分布式结构,java类要在不一样进程间传递,须要要求实现该接口;hibernate要求持久化类必须实现一个带空参数的构造函数。
二、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语句的开销。