• Hibernate基础知识整理(一)


    Hibernate的bean要求:

    (1)有无参构造方法;

    (2)有无意义的标志id,对应数据库的主键;

    (3)非final类(符合懒加载)。

    hibernate映射文件:

    用于说明java对象与哪个表中的记录相对应,以及java对象中的各个属性分别对应表中的哪一项,不同性质的属性(例如,主键和普通属性)用不同的标签来映射,如果java对象中的某个属性不需要存储在数据库中,那么在hibernate映射文件中就不需要配置这个属性。

    关于使用表名和字段与关键字冲突的问题。
    如果表名和字段与关键字啊发生冲突,解决方案有两种:
    使用column和table,改表名或字段名;
    如果表名或者字段名不允许更改,可以在table或者column中字段前面加上符号"`",例如:<class name="User" column="`user`">.这个符号是键盘中~对应的那个键在英文状态下的符号

    摘抄自:http://www.cnblogs.com/aigeileshei/p/5796947.html

    Hibernate操作数据库步骤:

    (1)读取配置文件;Configuration c = new Configuration().configure();

    (2)读取映射文件,获取SessionFactory;SessionFactory sf = c.buildSessionFactory();

    (3)获取Session;Session s = sf.openSession();

    (4)打开事务;Transaction tx = s.beginTransaction();

    (5)持久化操作;get(),load(),save(),saveOrUpdate(),merge(),persist()

    (6)提交事务;tx.commit();-------------JDBC会自动提交事务,但是hibernate默认是不开启的,所以事务不提交,对象就不会更新到数据库中

    (7)关闭session;s.close()

    关于load()和get()的区别:

    一.加载数据不同:

    get()是立即从数据库拿到数据,返回的是实体对象;

    load()是懒加载,拿到的是代理对象,只有真正用到对象的属性的时候才从数据库查询(非getId方法);

    二.数据库中没有相应的数据时,load会抛出异常,而get会返回null;

    关于save()和persist()的区别:

    在事务边界之外persist方法不会执行insert语句,而save方法会执行insert方法然后再回滚。

    关于update 和 merge的区别:

    首先在更新数据的时候,两者都必须有id;

    update方法会直接执行update语句,更新后的对象状态变为持久态;

    而merge方法不同:

    merge会先select再update;而且merge后原来的对象仍是脱管的状态:merge(a);a仍然是脱管的

    (1)如果session中有与之对应相同的对象(即主键相同),则把要保存的对象复制给该对象,然后再update被覆盖后的session中的对象;

    (2)如果session中没有与之对应的对象,则从数据库查询,然后把查询出来的对象覆盖为要保存的对象,即update查出来的对象;

    关于flush和update区别:

    flush方法是将一级缓存和数据库同步;

    update方法是将脱管状态变为 持久态;

    flush应用场景:

    1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合 
    get()一个对象,把对象的属性进行改变,把资源关闭。
    2,transaction commit的时候(包含了flush),一般建议不需要手动调用flush方法,因为hibernate会自动帮我们处理;如果调用flush方法,会带来很大的资源消耗。

    关于lock和update区别:

    update方法是把脱管状态下的更新过的对象持久化;

    lock方法是一个没有更改过的脱管状态的对象变成持久状态(针对的是因Session的关闭而处于脱管状态的po对象(2),不能针对因delete而处于脱管状态的po对象)

    lock的操作步骤是:调用lock把未修改的对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush

     关于clear和evcit的区别:

    clear方法是清除所有session缓存中的持久化数据;evcit方法是清除某个对象的在session缓存;

    Hibernate中java对象的三种状态:

    自由态:跟session无关,在数据库中没记录;

    持久态:跟session有关联,在数据库中有记录;

    脱管态:跟session无关联,在数据库中有记录。

    hibernate提供了两种方式进行数据库表的查询操作:HQL和Criteria来完成复杂的语句查询。

    HQL:面向对象的查询语言,跟sql区别是hql是面向对象的,区分大小写,查询的是类对象,不是表,查询的是类属性,不是表字段,并且支持多态;

    HQL主要通过Query实现查询:

    Query query =session.createQuery("from User where name=:na");

    :na  即命名参数;

    Query  query = session.createQuery("from User where name = ?");

    ?  即占位符;

    当然参数较多时可以选择Map放参数:

    Query query = session.createQuery("from User where name = :na and birthday < :date");

    Map<String,Object> map = new HashMap<String,Object>;

    map.put("na","小唯");

    map.put("date",new Date());

     query.setProperties(map);

    List<User> list = query.list();

    Query经常用到的方法有:list(),uniqueResult(),setFirstResult(),setMaxResults();等

    Criteria是比HQL更加对象化的查询,正常使用添加查询条件如下:

    Criteria  c = session.createCriteria(User.class);

    c.add(Restrictions.eq("name","小唯"));

    c.add(Restrictions.lt("date",new Date()));

    List<User> list = c.list();

    Criteria经常用到的方法有:list(),uniqueResult(),setFirstResult(),setMaxResults();等

    恒之贵,无需三更起五更睡;最无益,只怕一日曝十日寒

    ——港湾小唯与之共勉

  • 相关阅读:
    洛谷P1120信息奥赛一本通1442 小木棍
    洛谷P1378 油滴扩展
    洛谷P1156 垃圾陷阱
    mybatis-Plus 实践篇之逆向工程
    Interceptor的使用及探究
    mysql,oracle,sqlServer 元数据查询
    navicat premium15免费版安装说明(附工具)
    打印日志你真的会吗?
    线程基础知识-必知必会
    空间复杂度&时间复杂度
  • 原文地址:https://www.cnblogs.com/xiaoweigangwan/p/7813707.html
Copyright © 2020-2023  润新知