本文链接:http://www.orlion.ml/37/

一、Configuration

1、AnnotationConfiguration

2、进行配置信息的管理

3、configure()方法通过传入一个配置文件来使用例:new Configutayion.configure("myhibernateconfig.xml")...如果不传入配置文件则默认为hibernate.cfg.xml

二、SessionFactory

1、维护着数据库的连接池,当它产生一个session的时候就是从数据库连接池中捡出一个连接交给这个session。

2、getCurrentSession():如果当前上下文环境已经有一个session了就直接获取这个sesssion如果没有则创建一个session,(在session提交前即执行session.getTransaction().commit()之前拿到的是同一个session,而当session提交后session会关闭,再拿到就是新的session)。事务提交自动close()

4、上下文:通过在配置文件中指定hibernate.current_session_context_class属性

有四个值:jta | thread | managed | custom.Class

jta(java transaction api):java中用来管理事务的API(分布式数据库事务管理)

如果值为thread当执行getCurrentSession()时就会从当前线程找session,如果没有找到session则创建session

3、openSession():永远会创建一个新的session。需要close()。

(注:先openSession()获取一个session1,然后getCurrentSession()获取一个session2,这两个session不会==。因为session1标记为需要关闭而session2标记不可关闭,两个session的实现类不同)

三、对象三种状态

Transient(临时状态):是刚刚new出来。内存中一个对象,没id,缓存中也没有(session缓存)

Persistent(持久化状态):执行sava()等其他方法之后会转成Persistent状态,该状态有id。内存中有,缓存中有,数据库中有,有id。

Detached(脱离管理状态):close()等其他方法之后会转成该状态。内存有,缓存没有(脱离管理了),数据库有,id有

例:

  1. Teacher t = new Teacher();// t:Transient状态
  2. t.setName("test1");// t:Transient状态
  3. t.setTitle("title1");// t:Transient状态
  4.  
  5. Session session = sf.openSession();
  6.  
  7. session.beginTransaction();
  8. session.save(t);
    System.out.println(t.getId());// t:Persistent状态
  9. session.getTransaction().commit();

  10. System.out.println(t.getId());// t:Detached状态
  11. session.close();

2、三种状态的区别

(1)有没有id;

  如果没有id一定是Transient状态

(2)id在数据库中有没有;

(3)id在内存中有没有(session缓存);

四、Session

1、管理一个数据库的任务单元(session来帮我们管理,进行curd)

2、方法(CURD)

(1)delete

  执行delete()方法会转成Transisent状态(参考三状态图),只要有id号就可以删除

(2)load(Class arg0 , Serialirable arg1),第一个参数是类,第二个是主键

  例:Teacher t = (Teacher)session.load(Teacher.class , 1);

  注:

  1. Teacher t = (Teacher)session.load(Teacher.class , 1);
  2. session.getTransaction().commint();
  3. System.out.println(t.getName());

这种写法会抛出LazyInitializationException:could not initialize proxy - no Session异常

原因是load返回代理对象,当执行load方法的时候并不会发出sql语句,而是等到执行取出t对象的属性的时候(比如执行getName()的时候)才执行。而例子中执行getName()的时候session事务已经提交了

  

(3)get(Class arg0  , Serialirable arg1)

  例:Teacher t = (Teacher)session.load(Teacher.class , 1);

  当执行get方法的时候会马上发出sql语句,然后从数据库中取出值装到对象t中。

(4)update

  (a)用来更新detached对象,更新完成后转为persistent状态

  (b)更新transistent对象会报错

  (c)更新自己设定id的transistent对象可以

  

  1. Teacher t = new Teacher();
  2.  
  3. t.setId(1); // 此时t是Transient状态
  4. t.setName("test1_test1");
  5. Session session1 = sf.getCurrentSession();
  6. session1.beginTransaction();
  7. session1.update(t);// 此时t是persistent状态,如果t没有setid则会抛出异常
  8. session1.getTransaction().commit();

  (d)Persistent状态的对象只要更改对象的某个属性就会在session commit的时候发生更新

  (e)更新部分更改的字段

    (1)在不想参与update属性上添加注解@Column(updatable=false)

    配置文件中可以在property节点上加上update="false"属性,这种方式不灵活很少用

    (2)在实体类对应的配置文件如Student.hbm.xml中<class name="Student">节点上添加属性dynamic-update="true"即:<class name="Student" dynamic-update="true">

这时候就会只改更新的属性

注:(注释内容)

  1. Session session = sf.getCurrentSession();
  2. session.beginTransaction();
  3. Student s = (Student)session.get(Teacher.class, 1);
  4. s.setName("test1_test");// 此时更新时将会只修改name即SQL:update student set name=? where id=?
  5. session.getTransaction().commit();
  6.  
  7. s.setName("test1_test1"); //
  8. Session session1 = sf.getCurrentSession();
  9. session1.beginTransaction();
  10. session1.update(s);// 此时更新时将会修改所有属性即SQL:update student set name=? , age=? , sex=? where id=?
  11. /**
  12. * 之所以第一处setName()只修改name而第二处会修改所有属性,是因为在第一处hibernate会有对比的对象会知道只有name属性修改了,
  13. * 但是在第二处由于hibernate没有对比的对象所以不知道有哪些属性修改了所以会修改全部的属性
    *
    * 如果想只修改name的属性的话可以使用merge()方法,这个方法会先执行select再update
  14. */
  15. session1.getTransaction().commit();

     (3)使用HQL语句(建议)

      

(5)saveOrUpdate(Object obj)

(6)clear()

无论是load还是get都会首先从session缓存中查找(一级缓存),如果没有,才会去数据库查找,调用clear()方法会强制清除session缓存

  1. Session session = sf.getCurrentSession();
  2. session.beginTransaction();
  3. Teacher t = (Teacher)session.load(Teacher.class, 1);// 此时并不执行sql
  4. System.out.println(t.getName());// 此时会执行语句
  5.  
  6. session.clear();
  7.  
  8. Teacher t2 = (Teacher)session.get(Teacher.class, 1);// 此时并不执行sql
  9. System.out.println(t2.getName());// 如果不加上session.clear()则此时不会执行sql语句因为session缓存中已经存在了Teacher对象,
  10. // 如果加上了的话则执行sql,因为clear方法会清除session缓存
  11. session.getTransaction().commit();

(7)flush()

可以强制进行从内存到数据库的同步。

  1. Session session = sf.getCurrentSession();
  2. session.beginTransaction();
  3. Teacher t = (Teacher)session.load(Teacher.class, 1);// 此时并不执行sql
  4.  
  5. t.setName("test1");
  6. session.flush();
  7. t.setName("test2");
  8. /**
  9. * 如果不加上session.flush()则只执行一次sql,而加上则会执行两次,第一此修改为test1第二次修改为test2
  10. */
  11. session.getTransaction().commit();

五、SchemaExport

new SchemaExport(new AnnotationConfiguration().configure()).create(true , true);

hibernate(五)核心开发接口与对象的三种状态的更多相关文章

  1. 【Java EE 学习 45】【Hibernate学习第二天】【对象的三种状态】【一对多关系的操作】

    一.对象的三种状态. 1.对象有三种状态:持久化状态.临时状态.脱管状态(游离状态) 2.Session的特定方法能使得一个对象从一个状态转换到另外一个状态. 3.三种状态的说明 (1)临时状态:临时 ...

  2. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  3. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...

  4. hibernate操纵数据库常用方法 及 hibernate对象的三种状态

    在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...

  5. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  6. hibernate对象的三种状态

    对于hibernate,我想不在这里讲解了,我们就直接进入主题 在这里我将要说的是"hibernate对象的三种状态",对象是我们十分熟悉的,对吧!而对于对象它有三种状态 分别是瞬 ...

  7. Hibernate之对象的三种状态

    Hibernate之Java对象的三种状态 一.简述 本博文大部分的思想和内容引子CSND上名为 FG2006 这位大神的文章,连接地址为:http://blog.csdn.net/fg2006/ar ...

  8. Hibernate(六)__对象的三种状态

    瞬时(transient):数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象. 持久(persistent):数据库中有数据与之对应,当前 ...

  9. Hibernate 对象的三种状态

    hibernate对象的三种状态: (一) 瞬时(临时)状态:   对象被创建时的状态,数据库里面没有与之对应的记录! (二) 持久状态:   处于session的管理中,并且数据库里面存在与之对应的 ...

随机推荐

  1. Freemarker日期格式化处理

    基本参数: date: 只显示日期,不显示时间.如${createTime?date} 或${createTime?date('yyyy-MM-dd')} time: 只显示时间,不显示日期如${cr ...

  2. 关于PHP堆栈与列队

    在PHP中数组常被当作堆栈(后进先出:LIFO)与队列(先进先出:FIFO)结构来使用.PHP提供了一组函数可以用于push与pop(堆栈)还有shift与unshift(队列)来操作数组元素.堆栈与 ...

  3. Pyhton开源框架(加强版)

    info:Djangourl:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC)风格的 ...

  4. 图的邻接多重表和搜索(C++版本)

    最近在学数据结构,学到图这一章,网上的C++版本的代码乱得不行,所以自己写了一个完整C++版本的放这里. 用邻接多重表表示一个无向图,并给出DFS和BFS搜索代码.邻接多重表好处就是贼直观,几条边就几 ...

  5. Ubuntu下使用USB串口

    Ubuntu本身一般都带了USB转串口的驱动. 1. 首先确认系统支持USBSerial,输入以下命令:      lsmod | grep usbserial 2. 接上USB串口线,看看系统是否可 ...

  6. [转] How to import a large data set using XPO efficiently within a transaction

    https://www.devexpress.com/Support/Center/Example/Details/T333879

  7. 基于SpringMVC的增删改查

    废话不多说,直接开始步骤! 1.创建一个Dynamic Web Project 2.在WEB-INF包下的lib文件夹中引入相关jar commons-logging-.jar jstl.jar sp ...

  8. python 装饰器初步学习

    第一步 简单函数 ''' 简单的函数:调用两次''' def myfunc(): print ('myfunc() called.') myfunc() myfunc() 第二步 装饰器为调用函数提供 ...

  9. Android ExpandableListView

    ExpandableListView 结合SimpleExpandableListAdapter用法 最终实现效果: activity_main.xml <?xml version=" ...

  10. Oracle的update语句优化研究

    最近研究sql优化,以下文章转自互联网: 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation s ...