zoukankan      html  css  js  c++  java
  • Hibernate动态更新

    Hibernate一级缓存:


    Hibernate有一级和二级缓存。一级缓存就是Session。

    在Hibernate启动的时候,SessionFactory解析映射文件的时候,会根据映射文件中的字段生成查询、删除和更新语句。例如Student类对应的映射为id->id,name->s_name,age->s_age。后面的字段是数据库定义字段。那么在Hibernate启动的时候,会为Student生成查询语句 select * from student,删除语句delete from student where id= ?,更新语句:update student set s_name =? ,s_age = ? where id = ?。

    Hibernate这样做,自然是为了运行时的性能考虑。

     

    动态更新的需求:


    但是当表中的字段过多,而我们需要更新的字段却很少的情况下,Hibernate这种工作方式,无疑会带来数据库的压力。甚至有的情况是,我们虽然执行了session.update()语句,但是数据本身和数据库是一样的,并不需要更新。Hibernate不会自动处理这种情况,我们可以通过配置来完成动态更新。

     

    动态更新的实现:


    实现动态更新数据,必须把对象中的数据和数据库数据进行对照,也就是说我们必须先进行查询。查询后,对比数据,然后只针对修改的数据进行更新。

    查询对于数据库性能的影响微乎其微,所以在相应的实体类映射文件中,推荐使用动态更新。

    对于xml映射文件来说,在<class>元素上添加属性select-before-update="true"  dynamic-update="true"。

    对于实体类注解来说,在类上面使用注解:

              @DynamicUpdate(true)
              @SelectBeforeUpdate(true)
     
     

    动态更新适用环境:


    对于字段过多表来说,应该使用动态更新;

    对于更新频繁的表来说,应该使用动态更新;

    对于使用了Hibernate拦截器,而又不想使用事务的时候,应该使用动态更新。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Linux Shell 用法
    gdb调试用法
    grep 用法总结
    Cmake用法
    Win64/Linux 上PyMouse安装
    两道拓扑排序的问题
    hiho一下第76周《Suzhou Adventure》
    这类问题需要利用二进制的特殊性
    这种题应该诸位处理
    两道人数多,课程少,query多的题
  • 原文地址:https://www.cnblogs.com/china-li/p/3287409.html
Copyright © 2011-2022 走看看