Hibernate配置文件主要有两个,一个是src路劲下的hibernate.cfg.xml配置文件;一个是位于domian下的JavaBean.hbm.xml映射文件。当然前提是将jar包导入。

两者都需要dtd约束分别位于hibernate3.jar 下 org.hibernate下 hibernate-configuration-3.0.dtd、hibernate-mapping-3.0.dtd。

一、hibernate.cfg.xml配置文件

1、连接数据库的基本配置:

<hibernate-configuration>
	<session-factory name="foo">
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">***</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hbm</property>
        </session-factory>
</hibernate-configuration>

2、显示hibernate给自动生成的sql语句


<property name="show_sql">true</property>

3、格式化显示  hibernate给自动生成的sql语句


<property name="format_sql">true</property>

4、hbm2ddl.auto数据库表的生成策略,属性:update、create、create-drop、validate。其定义在源码的project->etc->hibernate.properties中。

<property name="hbm2ddl.auto">update</property>

update:当数据库存在表的时候,不会创建;当数据库不存在表时,会创建      注:数据库不能自动创建


存在:表结构和实体一致,不会修改表,表结构和实体类不一致,会修改表,但是保留原有的列,增加字段(表结构中增加实体类中对应字段不一致的列)


create:每次都会创建数据库表,会造成数据丢失,慎用


create-drop:每次都会创建数据库表,运行结束时会删除表-》不用


validate:验证,不创建表,不删除表,只是验证表结构是否正确


5、指定数据库使用的方言,因为不同数据库的sql语句是有区别的,所以需要告诉hibernate使用的是那种方言,当使用不同数据库时,修改适配方言,Hibernate会作自动的适配。其定义在源码的project->etc->hibernate.properties中。

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

例如有以下属性:

#hibernate.dialect org.hibernate.dialect.MySQLDialect
 #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
 #hibernate.dialect org.hibernate.dialect.Oracle10gDialect

6、自动提交事务

<property name="hibernate.connection.autocommit">true</property>

7、hibernate支持,将创建的session绑定到本地线程中,底层使用ThreadLocal,在程序之间共享session。

使用getCurrentSession前必须在hibernate中加入的配置

property name="hibernate.current_session_context_class">thread</property>

8、对象和数据库的表的映射


<mapping resource="com/zgf/domain/User.hbm.xml"/>

对象和数据库的表的映射。读取映射文件 JavaBean.hbm.xml(有命名规范)  在 hibernate.cfg.xml中配置了,就不用添加如下语句;当在配置文件hibernate.cfg.xml中加入了映射文件的配置,就不用写了。

config.addClass(User.class);

二、JavaBean.hbm.xml映射文件

ORM元数据:对象中属性,与表的字段,存在对应关系。

1、映射实体类和表

<hibernate-mapping package="com.zgf.domain">
       <class  name="User" table="user" dynamic-insert="true" dynamic-update="true"><!-- name="com.zgf.domain.User" -->
    </class>
</hibernate-mapping>

或者直接在class中添加:

name="com.zgf.domain.User"

2、映射主键字段和实体类  的属性,必须要有主键

<id name="id" column="id">
	<generator class="native"></generator>
</id>

length:设置表中id字段的长度 注:对数值型的不起作用,对String起作用length="10"

unsaved-value="0":告诉数据库当id的值是0是不保存,当成null处理。JavaBean中定义对象最好使用包装类,如:int默认值为0,Integer默认值是null方便业务需求处理。当主键自己给定时需要,是自动增长(不为0),处理也OK。

access:访问对象属性的方式.默认访问时get、set方法. access="field"直接操作对象的属性,不通过get、set方法:但是违背了java的封装性。
generator:主键在数据库表中的生成策略-->native:主键的值由数据库自动生成
有以下策略:
 a、increment:由数据库生成,从数据库查询主键字段上的最大值再加1,执行select max(id)语句,生成的主键不是自动增长的(auto-increment)放在事务中
 b、identity:由数据库生成自动增长的主键,主键默认就是自动增长的,执行insert语句
 c、sequence:序列,数据库使用序列生成主键的值,mysql不支持,Oracle支持
 d、hilo:算法,既没有序列,也没有自动增长,使用hilo算法生成主键的值(生成的每一位都不相同)
 e、native:三选一,identity,sequence,hilo
 f、uuid:主键是32位不重复的唯一的字符串,需要id是字符串类型的,注意需要修改javabean中int-》Stirng 重新生成set、get方法
 g、assigned:自己指定id的值,自然主键,主键默认值是0,该是null
3、映射普通字段和实体类中的属性

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

如:not-null="true" unique="true"


type:三种类型中的哪一种都可以:


a、java中的类型:type="java.lang.String"
b、数据库中的类型:type="varchar"
c、hibernate中的类型:string(小写的string)

三、Hibernate中持久化类(实体类)

1 、编写规则

提供一个无参数 public访问控制符的构造器(构造方法)(映射文件反射) 不写,默认有无参的构造(newInstance)
提供一个标识属性,映射数据表主键字段
所有属性提供public访问控制符的 set  get 方法(javaBean) (反射)
标识属性应尽量使用基本数据类型的包装类型(int-->Integer默认null)
不要用final修饰实体 (load延时加载将无法生成代理对象进行优化) 延迟加载是 基于子类的代理
2、持久化对象的唯一标识

Java按地址区分同一个类的不同对象,关系数据库用主键区分同一条记录,Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。

对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID付值

3、自然主键和代理主键

自然主键:   在业务中,某个属性符合主键的要求(不为空、不能重复、不能改变).那么该属性可以作为主键列.

代理主键:     在业务中,不存符合以上3个条件(不为空、不能重复、不能改变)的属性,那么就增加一个没有意义的列.作为主键.

4、基本类型和包装类型

 基本类型无法表达null、数字类型的默认值为0。

包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。