zoukankan      html  css  js  c++  java
  • Hibernate总结

     get和load区别

      load加载方法:Users user = (Users)session.load(Users.classnew Integer(1));  

      get加载方法: Users user = (Users)session.get(Users.classnew Integer(1));  

      以上面代码为例: 
    区别一:如果没有id为1的Users对象,那么,如果通过get方法加载,则返回的是一个null,如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如  user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException
    区别二:load支持延迟加载,get不支持延迟加载
    也就是说:Users user = (Users)session.load(Users.class, new Integer(2));这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询,而Users user = (Users)session.get(Users.class, new Integer(1));则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, new Integer(2));不会执行任何sql.

    Java代码: Users user = (Users)session.load(Users.classnew Integer(2));   System.out.println(user.getId());  

    上面这2句代码,不会去执行数据库操作,也就是说不执行sql,因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是id的值,这里为2,值用到时去数据库加载。但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。


    persist(),save(),saveOrUpdate()区别
    persist():只接受临时状态的对象,即主键没有值的对象,如果传递一个非临时状态的对象给它,则会抛出异常。
    save():无论对象是否处于临时状态都会向数据库保存
    saveOrUpdate():如果主键有值则执行update,如果主键没有值则执行insert

    load()---->setXX() 和 update()区别
    load()--->setXX():支持动态更新
    update:不支持动态更新
    动态更新需要在配置文件里加上:dynamic-update="true"
    如:

    Java代码

    <class name="com.domain.Users" table="users" dynamic-update="true">  

     
    以一个user表为例:
    CREATE TABLE `users` (   

      `id` int(11) NOT NULL auto_increment,   

     `name` varchar(255) NOT NULL,   

      `password` varchar(255) NOT NULL,   

      PRIMARY KEY  (`id`)   

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  


    表里有1条数据:
    id   name       password
    1    ttitfly       password1

    通过load()---->setXX方式更新
    Java代码

    Users user = (Users)session.load(Users.classnew Integer(1));   

    user.setPassword("testtest");  


    A:dynamic-update="false" 的时候,执行的sql:

    update   users    set   name=?,   password=?   where   id=?  


    可以看出本来只是对password进行修改,结果把name字段也给更新了。如果一个表里有很多字段,就会对效率产生影响。

    B:dynamic-update="true" 的时候,执行的sql:

    update   users    set   password=?   where   id=?  


    可以看出只对password进行更新。

    当用update进行更新时:

    Java代码

    Users user = new Users();   

    user.setId(new Integer(1));   

    user.setUsername("ttitfly");   

    user.setPassword("1234561");   

    session.update(user);   

    session.beginTransaction().commit();  


    即使dynamic-update="true" ,执行的sql为:

    update   users    set   name=?,   password=?   where   id=?  

    即 对所有字段都进行更新,所以说update时不支持动态更新的。

    evict()与clear()

    evict():从session缓存里清除某一个对象 

    clear():从session缓存里清除所有对象


     session.connection 每次调用如果调用了hibernate里的方法,connection都会不一样,

  • 相关阅读:
    通用人工智能离我们还有多远?
    自动化机器上的物联网网关的目的是什么?
    提效降本,您不可不知道的云架构秘诀
    “影子物联网”:日益增长的企业安全盲区
    查找练习 hash——出现过的数字
    查找练习 hash——出现过的数字
    数据结构上机实验之二分查找
    数据结构上机实验之二分查找
    简单字符串比较
    简单字符串比较
  • 原文地址:https://www.cnblogs.com/TankMa/p/1998933.html
Copyright © 2011-2022 走看看