Hibernate配置文件解读

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、连接数据库的基本配置:


	
		com.mysql.jdbc.Driver
		root
		***
		jdbc:mysql://localhost:3306/hbm
        
 
2、显示hibernate给自动生成的sql语句

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

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

update
update:当数据库存在表的时候,不会创建;当数据库不存在表时,会创建      注:数据库不能自动创建
存在:表结构和实体一致,不会修改表,表结构和实体类不一致,会修改表,但是保留原有的列,增加字段(表结构中增加实体类中对应字段不一致的列)
create:每次都会创建数据库表,会造成数据丢失,慎用
create-drop:每次都会创建数据库表,运行结束时会删除表-》不用
validate:验证,不创建表,不删除表,只是验证表结构是否正确

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

org.hibernate.dialect.MySQLDialect 
例如有以下属性:

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

6、自动提交事务

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

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

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

config.addClass(User.class);
二、JavaBean.hbm.xml映射文件

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

1、映射实体类和表


       
    

或者直接在class中添加:
name="com.zgf.domain.User"
2、映射主键字段和实体类  的属性,必须要有主键


	
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、映射普通字段和实体类中的属性


如: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。当对于默认值有业务意义的时候需要使用包装类。






你可能感兴趣的:(hibernate)