hibernate文件配置和注解配置

##hibernate文件配置和注解配置<br>


 <font color=red size=6> 一对多</font><br>


- 车主和自行车表<br>     
-         
         <!--车主实体类 车集合-->
     <set name="bikeSet" cascade="save-update" >
      <!-- 利用从表的哪个外键,关联主表 -->
      <key column="nameId"></key>
      <!-- 设置集合中存放的元素类型 -->
      <one-to-many  class="com.project.bean.BikeBean"/>
         </set>

          <!--车实体类 车主对象-->
        <!-- lazy="false" 表示消除延迟加载,查询从表记录时,马上查询主表记录 -->
        <many-to-one  lazy="false"    name="man" class="com.project.bean.ManBean" column="nameId"></many-to-one>




- 注解配置 一对多
-     
    
               <!--车主实体类 车集合-->
      @OneToMany(targetEntity=BikeBean.class)//配置一对多,targetEntity配置集合存放元素的类型
       @JoinColumn(name="nameId")//配置从表外键列名
          <!--车实体类 车主对象-->
       @ManyToOne(fetch=FetchType.EAGER)//配置多对一,同时申明关联对象为立即加载
       @JoinColumn(name="nameId")


 <font color=red size=6> 多对多</font><br>


- 用户和角色表<br>  

              <!--用户实体类 角色集合-->
              <!-- 多对多 需要在set标签中加上 table属性 中间表的表名 -->
         <set name="roleSet" table="t_role_user" >
       <!-- 当前实体类,对应的中间表的外键 -->
       <key column="userId" ></key>
      <!-- class表示集合中存放元素类型,colum表示集合中存放的元素对应中间的外键 -->
      <many-to-many class="com.project.bean.RoleBean" column="roleId"></many-to-many>
    
        </set>  
             <!--角色实体类 客户集合-->    


        <set name="userSet" table="t_role_user">
        <key column="roleId"></key>
        <many-to-many class="com.project.bean.UserBean" column="userId"></many-to-many>
        </set>  

 - 注解配置 多对多

                <!--用户实体类 角色集合-->
      @ManyToMany(targetEntity=RoleBean.class)//配置多对多。指明元素类型
            @JoinTable(
        name="t_role_user",//中间表名
        joinColumns={@JoinColumn(name="userId")},//当前对象映射中间表的外键列名
        inverseJoinColumns={@JoinColumn(name="roleId")}//集合中的元素对应中间的外键
        )
        private Set<RoleBean> roleSet=new HashSet<>();  


     hibernate注解配置


           @Entity //表示该类为实体类,可以通过注解操作


           @Table(name="t_school") //该类和数据库中的哪个表做映射
             public class SchoolBean {

             }



                  @Id      //标识主键属性


              @GeneratedValue(strategy=GenerationType.IDENTITY) //主键生成策略
           private int id;
           属性和列名不一致的时候


               @Column(name="schoolName")
            private String name;
              @Transient表示该属性并非一个到数据库表的字段的映射


          oracle注解添加主键生成策略
          @id
              @sequenceGenerator(name="seq",allocationSize=1,initialvalue=1,sequenceName="S_AUTOID")
              @GeneratedValue(strategy=GenerationType.SEQENCE,generator="seq") //主键生成策略
- 文件配置和注解配置映射也会改变在hibernate.cfg.xml中

       <mapping resource="orm/StudentBean.hbm.xml"/>变成    <mapping class="com.project.bean.SchoolBean"/>

##缓存分类


- 一级缓存:即在当前事务范围内的数据缓存;就hibernate而言,session一旦关闭,一级缓存就清除,一级缓存为hibernate自带的缓存,是必须的


- (应用级)二级缓存:即在某个应用中或应用某个独立数据库访问子集中的共享缓存,此缓存可以由多个事务共享。就hibernate中,二级缓存由sessionfactory管理。


- 分布式缓存:即在多个应用实例,多个JVM间的共享缓存策略。



- 二级缓存
使用第三方缓存组件;EHcache、Oscache作为Hibernate

      <!-- 指明二级缓存产品 -->
        <property name="hibernate.cache.region.factory_class">
        org.hibernate.cache.ehcache.EhCacheRegionFactory
        </property>
        <!-- 配置schoolBean需要的二级缓存 -->
        <class-cache usage="read-write" class="com.project.bean.SchoolBean"/>
        
##所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作;


- Hibernate的延迟加载


- 延迟加载类型


- 1.实体对象的延迟加载


- 2.集合的延迟加载(一对多和多对多时,关联集合)


- 3.属性的延迟加载(clob大数据类型时)
 

- 属性延迟加载
  

- Clob 大数据文本
 

-  Blob 存放大数据的二进制数据



##数据库连接池:(为什么要使用连接池,因为数据库每次访问都建立一次链接,每次数据库链接后,都需要断开,不能控制被创建的链接对象。)


- 不用连接池的弊端:
1.流的操作频繁 2.不能控制链接数量



##连接池作用:
 

- 解决资源的频繁分配,防止系统无休止的数据库连接,监视数据库的连续的数量、使用情况、为系统开发、测试及性能调整提供数据。
 


- 连接池的工作原理;
   当DAO需要链接对象时,从连接池中找到状态为空闲的连接,分配给操作用户。
   如果连接池中没有空闲连接,这里就需要检查连接池中,连接数量是否达到最大连接数量。没有到达最大连接数,那么新建连接对象,放入连接池,分配给操作用户。
   如果已经达到最大连接数,那么操作用户就等待一段时间,这段时间之内,如果有连接被释放,那么分配给等待用户。超过这段时间,那么久返回null。

        配置连接池
          <!-- 连接池 -->
        <!-- 最大连接数 -->
        <property name="hibernate.dbcp.ps.maxActive">100</property>
        <!-- 最小连接数 -->
        <property name="hibernate.dbcp.ps.maxIdle">20</property>
        <!-- 超时时间 -->
        <property name="hibernate.dbcp.ps.maxWait">300</property>


##悲观锁
   

- 实现依赖于数据库机制,在整个过程中,将数据锁定,其他任何用户不能对其读取和修改,一般适用于短事务,并发性不好。
##乐观锁
    1. 乐观锁依靠数据版本记录机制实现
    2.位数据增加一个版本标识,增加一个version字段
    3.读取数据时,将版本号一同读书
    4.更新时,版本号加一
    5.将提交数据的版本与数据库表对应记录的当前版本信号进行比对
    6.如果提交的数据版本号大于数据库当前版本号,则更新,否则认为是过期版本。

##hibernate常见的优化策略

      1.用高版本的hibernate;
     2.制定合理的缓存策略;
    3.采用合理的session机制;
    4.尽量使用延迟加载;
    5.如有可能,采用UUID作为主键生成策略;
    6.如果有可能,选用乐观锁代替悲观锁;
    7.在开发中,显示hibernate执行的SQL语句。从而制定更好的实现策略;
    8.复杂查询和统计查询可以使用SQL语句完成,设置可能可以考虑使用存储过程完成。

posted @ 2017-06-29 23:25  Java初中生  阅读(73)  评论(0)    收藏  举报