• Hibernate 文件配置及session


    计应134(实验班)  韩凯丽

    Hibernate

    Hibernate的配置文件

    1. <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式-->   
    2.                 <?xml version='1.0' encoding='gb2312'?>   
    3. <!--表明解析本XML文件的DTD文档位置,DTD是Document Type Definition 的缩写,即文档类型的定义,XML解析器使用DTD文档来检查XML文件的合法性。hibernate.sourceforge.net/hibernate-configuration-3.0dtd可以在Hibernate3.1.3软件包中的srcorghibernate目录中找到此文件-->   
    4. <!DOCTYPE hibernate-configuration PUBLIC   
    5.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
    6.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">   
    7.     <!--声明Hibernate配置文件的开始-->        
    8.     <hibernate-configuration>   
    9.     <!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作-->   
    10. 10.       <session-factory>      
    11. 11.       <!--配置数据库的驱动程序,Hibernate在连接数据库时,需要用到数据库的驱动程序-->   
    12. 12.           <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver </property>   
    13. 13.       <!--设置数据库的连接url:jdbc:mysql://localhost/hibernate,其中localhost表示mysql服务器名称,此处为本机,    hibernate是数据库名-->    
    14. 14.             <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate </hibernate>   
    15. 15.     <!--连接数据库是用户名-->   
    16. 16.           <property name="hibernate.connection.username">root </property>   
    17. 17.           <!--连接数据库是密码-->   
    18. 18.           <property name="hibernate.connection.password">123456 </property>          
    19. 19.           <!--数据库连接池的大小-->   
    20. 20.           <property name="hibernate.connection.pool.size">20 </property>          
    21. 21.         <!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于差错,程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率-->   
    22. 22.         <property name="hibernate.show_sql">true </property>   
    23. 23.         <!--jdbc.fetch_size是指Hibernate每次从数据库中取出并放到JDBC的Statement中的记录条数。Fetch Size设的越大,读数据库的次数越少,速度越快,Fetch Size越小,读数据库的次数越多,速度越慢-->   
    24. 24.         <property name="jdbc.fetch_size">50 </property>   
    25. 25.         <!--jdbc.batch_size是指Hibernate批量插入,删除和更新时每次操作的记录数。Batch Size越大,批量操作的向数据库发送Sql的次数越少,速度就越快,同样耗用内存就越大-->   
    26. 26.         <property name="jdbc.batch_size">23 </property>   
    27. 27.         <!--jdbc.use_scrollable_resultset是否允许Hibernate用JDBC的可滚动的结果集。对分页的结果集。对分页时的设置非常有帮助-->   
    28. 28.         <property name="jdbc.use_scrollable_resultset">false </property>   
    29. 29.         <!--connection.useUnicode连接数据库时是否使用Unicode编码-->   
    30. 30.         <property name="Connection.useUnicode">true </property>   
    31. 31.         <!--connection.characterEncoding连接数据库时数据的传输字符集编码方式,最好设置为gbk,用gb2312有的字符不全-->   
    32. 32.     <property name="connection.characterEncoding">gbk </property>        
    33. 33.           
    34. 34.         <!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。-->   
    35. 35.           <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property>   
    36. 36.         <!--指定映射文件为“hibernate/ch1/UserInfo.hbm.xml”-->          
    37. 37.           <mapping resource="org/mxg/UserInfo.hbm.xml">   
    38. 38.   </session-factory>   
    39. 39.   </hibernate-configuration>      
    40. 40.     
    41. 41.     
    42. 42.     
    43. 43.   <bean id="dataSource"    
    44. 44.   class="org.apache.commons.dbcp.BasicDataSource"    
    45. 45.   destroy-method="close">    

    46. //连接驱动      

    1. 47.   <property name="driverClassName" value="${jdbc.driverClassName}" />    

    48. //连接url,      

    49. <property name="url" value="${jdbc.url}" />    

    50. //连接用户名      

    1. 51.   <property name="username" value="${jdbc.username}" />    

    52. //连接密码      

    1. 53.   <property name="password" value="${jdbc.password}" />    

    54. </bean>    

    1. 55.     

    56. <bean id="hbSessionFactory"    

    1. 57.   class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    
    2. 58.   <property name="dataSource" ref="dataSource" />    
    3. 59.   <property name="configLocation">    

    60. //hibernate配置文件位置      

    1. 61.   <value>WEB-INF/hibernate.cfg.xml </value>    
    2. 62.   </property>    
    3. 63.   <property name="configurationClass"    
    4. 64.   value="org.hibernate.cfg.AnnotationConfiguration" />    
    5. 65.   <property name="hibernateProperties">    
    6. 66.   <props>    
    7. 67.   //针对oracle数据库的方言,特定的关系数据库生成优化的SQL      
    8. 68.     <prop key="hibernate.dialect">    
    9. 69.     org.hibernate.dialect.OracleDialect      
    10. 70.     </prop>    
    11. 71.   //选择HQL解析器的实现      
    12. 72.     <prop key="hibernate.query.factory_class">    
    13. 73.     org.hibernate.hql.ast.ASTQueryTranslatorFactory      
    14. 74.     </prop>    
    15. 75.     //是否在控制台打印sql语句      
    16. 76.     <prop key="hibernate.show_sql">true </prop>    
    17. 77.     //在Hibernate系统参数中hibernate.use_outer_join被打开的情况下,该参数用来允许使用outer join来载入此集合的数据。      
    18. 78.     <prop key="hibernate.use_outer_join">true </prop>    
    19. 79.   //默认打开,启用cglib反射优化。cglib是用来在Hibernate中动态生成PO字节码的,打开优化可以加快字节码构造的速度      
    20. 80.   <prop key="hibernate.cglib.use_reflection_optimizer">true </prop>    
    21. 81.   //输出格式化后的sql,更方便查看      
    22. 82.   <prop key="hibernate.format_sql">true </prop>    
    23. 83.   //“useUnicode”和“characterEncoding”决定了它是否在客户端和服务器端传输过程中进行Encode,以及如何进行Encode      
    24. 84.   <prop key="hibernate.connection.useUnicode">true </prop>    
    25. 85.   //允许查询缓存, 个别查询仍然需要被设置为可缓存的.      
    26. 86.   <prop key="hibernate.cache.use_query_cache">false </prop>    
    27. 87.   <prop key="hibernate.default_batch_fetch_size">16 </prop>    
    28. 88.     //连接池的最大活动个数      
    29. 89.     <prop key="hibernate.dbcp.maxActive">100 </prop>    
    30. 90.   //当连接池中的连接已经被耗尽的时候,DBCP将怎样处理(0 = 失败,1 = 等待,2  =  增长)      
    31. 91.     <prop key="hibernate.dbcp.whenExhaustedAction"></prop>    
    32. 92.     //最大等待时间      
    33. 93.     <prop key="hibernate.dbcp.maxWait">1200 </prop>    
    34. 94.     //没有人用连接的时候,最大闲置的连接个数      
    35. 95.     <prop key="hibernate.dbcp.maxIdle">10 </prop>    
    36. 96.     ##以下是对prepared statement的处理,同上。      
    37. 97.     <prop key="hibernate.dbcp.ps.maxActive">100 </prop>    
    38. 98.     <prop key="hibernate.dbcp.ps.whenExhaustedAction"></prop>    
    39. 99.     <prop key="hibernate.dbcp.ps.maxWait">1200 </prop>    
    40. 100.     <prop key="hibernate.dbcp.ps.maxIdle">10 </prop>    
    41. 101.   </props>    
    42. 102.   </property>    

    103. </bean>   

    Hibernate持久化类:

    持久化顾名思义就是把缓存中的东西放到数据库中使之持久.对于需要持久化的对象,它的生命周期分为三个状态:临时状态,持久化状态,游离状态.
    临时状态:刚刚用new语句创建,没有被持久化,不处于session的缓存中.处于临时状态的java对象被称为临时对象.
    持久化状态:已经被持久化,加入到session的缓存中.处于持久化的java对象被称为持久化对象.
    游离状态:已经被持久化,但不处于session的缓存中,处于游离状态的java对象被成为游离对象.
    持久化对象的特征:
    .  位于一个session事例的缓存中,可以说持久化对象总是被一个session事例关联
    .  持久化对象和数据库中的相关记录对应
    .  Session在清理缓存时,会根据持久化对象的属性变化来同步更新数据库
    .  Session的save()方法把临时状态变为持久化状态.
    .  Session的update() ,saveOrUpdate()和lock()方法使游离状态变为持久化状态.

    Hibernate持久化对象状态

    理解Session的缓存:

    在Session接口的实现中定义一系列的Java集合,这些集合构成了Session的缓存。

    Session缓存的作用:1、减少访问数据库的频率,可以提高数据库访问的性能。2、保证缓存中的对象与数据库中的相关记录保持同步。3、当缓存中的持久化对象(位于缓存中的对象)之间存在循环关联关系时,Sessioin会保证不出现访问对象的死循环。

    在Hibernate应用中Java对象的状态:

    临时状态(transient):刚用new语句创建,还没有被持久化,不处于Session的缓存中。处于临时状态的Java对象称为临时对象。

    持久化状态(persistent):已经被持久化,加入到Session的缓存中。处于持久化状态的Java对象称为持久化对象。

    游离状态(detached):已经被持久化,但不再处于Session的缓存中。处于游离状态的Java对象称为游离对象。

    Java对象:开始生命周期——》临时状态——》持久化状态——》游离状态——》结束生命周期

     Session的保存、更新、删除、查询方法:

    1、Session的save()方法

    session.save(customer);完成的操作:

    (1)把Customer对象加载到缓存中,使它变为持久化对象。

    (2)选用映射文件指定的标识符生成器为持久化对象分配唯一的OID。Customer.hbm.xml文件中<id>元素的<generator>子元素指定标识符生成器。

    (3)计划执行一个insert语句,把Customer对象当前的属性值组装到insert语句中。

    insert into CUSTOMERS(ID, NAME, ......) values(1, "Tom", ......)

    save()方法并不立即执行SQL insert语句。只有当Session清理缓存时,才会执行SQL语句。

    2、Session的update()方法

    session.update(customer);完成的操作:

    (1)把Customer对象重新加入到Session缓存中,使它变为持久化对象。

    (2)计划执行一个update语句。Session只有在清理缓存时才会执行update语句,并且在执行时才会把Customer对象当前的属性值组装到update语句中。

    (3)只要通过update()方法使游离对象被一个Session关联,即使没有修改Customer对象的任何属性,Session在清理缓存时也会执行由update()方法计划的update语句。

    update CUSTOMERS set NAME="Tom", ...... where ID=1

    如果希望Session仅当修改了Customer对象的属性时,才执行update语句,可把映射文件Customer.hbm.xml中<class>元素的"select-before-update"设为true(该属性默认为false)

    <class name="mypack.Customer" table="CUSTOMERS" select-before-update="true">

    当Session清理缓存时,先执行一条select语句,然后比较Customer对象的属性是否和从数据库中检索出来的记录一致,只有在不一致时才执行update语句。

    3、Session的saveOrUpdate()方法

    如果传入的参数是临时对象,就调用save()方法;如果传入的参数是游离对象,就调用update()方法;如果传入的参数是持久化对象,那就直接返回。

    Hibernate判断临时对象的条件:

    (1)Java对象的OID取值为null

    (2)Java对象具有version属性并且取值为null

    (3)在映射文件中为<id>元素设置了unsaved-value属性,并且OID取值与unsaved-value属性只匹配

    (4)在映射文件中为version属性设置了unsaved-value属性,并且version属性取值与unsaved-value属性值匹配

    (5)自定义了Hibernate的Interceptor实现类,并且Interceptor的isUnsaved()方法返回Boolean.TRUE

    4、Session的load()方法和get()方法

    根据给定的OID从数据库中加载一个持久化对象。

    当数据库中不存在与OID对应的记录时

    load()方法,返回ObjectNotFoundException异常

    get()方法,返回null。

    5、Session的delete()方法

    如果传入的参数是持久化对象,Session就计划执行一个delete语句;如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句。

    Session只有在清理缓存的时候才会执行delete语句。只有当调用Session的close()方法时,才会从Session的缓存中删除该对象。

    session.delete(customer);

    session.delete("from Customer as c where c.id>8");

    级联操纵对象图

    在对象-关系关联映射文件中,用于映射持久化类之间关联关系的元素<set>、<many-to-one>、<one-to-one>有cascade属性,用于指定如何操纵与当前对象关联的其他对象。

    cascade属性可选值:none、save-update、delete、all、delete-orphan、all-delete-orphan

    Hibernate与触发器协同工作

    能激发触发器运行的事件:

    插入(insert)记录事件、更新(update)记录事件、删除(delete)记录事件

     利用拦截器(Interceptor)生成审计日志

    用户定义的拦截器必须实现org.hibernate.Interceptor接口。

    Interceptor对象有两种存放方式:

    SessionFactory.openSession(Interceptor):为每个Session实例分配一个Interceptor实例,这个实例存放在Session范围内。

    Configuration.setInterceptor(Interceptor):为SessionFactory实例分配一个Interceptor实例,这个实例存放在SessionFactory范围内,被所有Session实例共享。

     

  • 相关阅读:
    分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结
    动态规划 BZOJ1925 地精部落
    线性DP SPOJ Mobile Service
    线性DP codevs2185 最长公共上升子序列
    数位DP POJ3208 Apocalypse Someday
    线性DP POJ3666 Making the Grade
    杨氏矩阵 线性DP? POJ2279 Mr.Young's Picture Permutations
    tarjan强连通分量 洛谷P1262 间谍网络
    树链剖分 BZOJ3589 动态树
    二分图 BZOJ4554 [Tjoi2016&Heoi2016]游戏
  • 原文地址:https://www.cnblogs.com/1225hkl/p/4566080.html
Copyright © 2020-2023  润新知