hibernate几点小解

  这已经是在项目中第三次用到hibernate了,刚开始hibernate时感觉很不错,因为可以省去很多繁琐的sql语句,但通过这几次在项目中用hibernate,就一个字形容“累”。。。。原因是我并没有真正地理解hibernate,经常出现no-session、two open session的问题,还经常出现查询数据时卡死的情况 。。。   ,所以决定这个项目完了后好好地学习下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语句查询普通属性,但不会影响到集合属性和单端上的
                        对象

你可能感兴趣的:(oracle,sql,Hibernate,mysql,bean)