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:当数据库存在表的时候,不会创建;当数据库不存在表时,会创建 注:数据库不能自动创建
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"
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。当对于默认值有业务意义的时候需要使用包装类。