这已经是在项目中第三次用到hibernate了,刚开始hibernate时感觉很不错,因为可以省去很多繁琐的sql语句,但通过这几次在项目中用hibernate,就一个字形容“累”。。。。原因是我并没有真正地理解hibernate,经常出现no-session、two open session的问题,还经常出现查询数据时卡死的情况
![](/images/smiles/icon_eek.gif)
。。。 ,所以决定这个项目完了后好好地学习下hibernate
Hibernate主要接口对象
1、Configuration对象:读取hibernate配置文件
2、SessionFactory对象:创建耗时,重量级的,通常只创建一次,线程安全,
session不是线程安全的 所以,一个请求对应一个session,请求完毕session关闭
3、Query对象:支持hql和sql
hibernate常用标签属性
1、hbm中心配置文件中配了hibernate.hbm2ddl.auto属性
a、create—drop:在显示关闭sessionFactory时,将drop掉数据库schema
b、update:对数据库表执行save操作时,即使数据库中没有对应的表(即没有ExportDB),
它会自动建立对应的数据库表;当在mapping文件中改变表中字段名时,那么执行save操作时,
以前的那个字段会留着不会删掉,但不管这个字段,新的字段会加入进去
2、<class>标签中 name:持久类的java全限定名
lazy:这个class是否支持lazy,默认是lazy的
get和load的区别:
get不支持lazy,load支持lazy;
get取得所有对象的属性,load只有在使用对象属性时才会向数据库发出sql语句查询
采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常;
3、<id>标签:必须配到class的第一个标签,唯一主键
name:实体类的属性
column:数据库表中对应的列名(没有默认是实体类属性测名字)
type:没有配,hibernate自动转换(如String——》varchar)
也可自己手动陪,如遇到String就转换成配置的int型
这个属性不是很重要,一般不配
generator:主键生成策略(主键必须配)
a、increament自增,缺陷:在分布式系统中,不唯一,这是在一个
jvm中唯一
b、identity自增,采用mysql数据库自增
c、sequence自增,采用oracle数据库自增
d、uuid自增 32位字符串,hibernate生成的唯一的id
e、native自增 根据数据库的生成能力选择生成方式,如果是mysql
就是identity,是oracle则是sequence,所以一般都配为native
f、assigned自增 手动自增
3、<property>标签:
name:实体bean的属性名
column:数据库表中对应的列名
type:与上面的一样
unique:设置属性的唯一性,默认是false可以重复
not-null:设置属性是否为空,默认是false可以为空
length:设置属性的长度
hibernate的lazy策略
1、集合上的lazy策略:可以取值true/false/extra,默认是true
load时: 普通属性加载,集合属性不会加载,只有在使用集合时
加载;所以class标签上的lazy只影响普通属性 ,不影响集合属性
起作用
extra:与lazy=true差不多,如果查询集合的长度,则只会查询集合
长度,不会查询每个集合元素,比较智能
2、单端关联中的lazy策略:(many-to-one,one-to-one)
可以取值:false/proxy/noproxy
默认情况为proxy:与lazy=“true”上面的一样,用的时候才会真正发出sql语句
lazy=false时:查询普通属性时,发出sql语句,这时也查询对象属性
(与集合属性一样)
3、class标签上的lazy=false,其他默认:
所以一开始load时就会发出sql语句查询普通属性,但不会影响到集合属性和单端上的
对象