Session:用来执行被持久化的增删查改操作,与数据库进行交互;Session对象是非线程安全的。
SessionFactory:用来负责初始化Hibernate。充当数据源的代理,并负责创建Session对象。线程安全的全局对象,只需要被实例化一次。
Transaction:负责事务相关的操作。
Query/Criteria:负责执行各种数据库查询操作,可以使用HQL和SQL语句两种表达方式。
Configuration:负责配置并启动Hibernate,创建SessionFactory对象。
1:Configuration接口启动Hibernate,创建SessionFactory对象
SessionFactory sessionFactory = new Configuration().configuration().buildSessionFactory();
2:SessionFactory创建Session
Session session = sessionFactory.openSession();
或者
Session session = sessionFactory.getCurrentSession();
openSession()和getCurrentSession()的区别:
http://blog.csdn.net/yannanying/article/details/46880583
3:使用Session创建对象
Hibernate中对象的三种状态
1)Transaction
- 瞬态,暂态,自由态;
- 由new命令开辟内存空间的Java对象,在内存中孤立存在,和数据库中的数据没有任何关系;
- 可以通过Session的save()或者saveOrUpdate()、persist()方法将瞬态对象与数据库相关联,将数据插入到数据库中,此时瞬态对象转变为持久化对象。
2)Persistent
- 持久化状态; 该状态的数据在数据库中具有对应的数据,并且拥有一个持久化标识;
- 可以通过Session的delete()方法将对应的数据库中的数据删除,此时持久化对象变成瞬态对象。
- 可以通过Session的close()或者clear()或者evict()方法,将持久化对象变成脱管对象,此时该对象具备数据库识别值,但是已经不再Hibernate持久层的管理之下。
3)Detached
- 脱管态,游离态;
- 持久态的对象如果与数据库记录不能保持同步,则该对象就转变为游离态;
- 游离态的对象仍然具备对应的数据库记录(即上面第2点提到的数据库识别值),但是数据的任何改变都不能传递给数据库。
3.1:获取对象的两种方法:get()和load()的区别
(注意:要检索的对象需要具备标识符和类型,否则需要借助查询接口Query和Criteria)
Entity entity = (Entity)Session.load(Entity.class,ID);
Entity entity = (Entity)Session.get(Entity.class,ID);
1)load()方法认为给定的标识ID对应的数据在数据库中一定存在,因此可以放心使用代理来延迟加载,如果数据不存在则只能抛出异常;
get()方法对于给定的标识ID进行查找,查找不到则返回null。
2)load()方法返回的是代理类实例;
get()方法返回的是实体。
3)load()方法可以充分在一级缓存和二级缓存中查找现有ID的数据;
get()方法只在一级缓存中查找,找不到则直接调用SQL在数据库中查找。
3.2:保存对象:save()和persist()方法的区别:
1)persist()方法无返回值,而save()方法返回保存对象的标识符。如entity的ID。
2)persist()方法只能保存瞬态和持久态的对象,保存其他状态的对象则会抛出异常。而save()方法可以保存任何状态的对象。
Entity entity = new Entity();
Session session = getSession();
Trasaction tx = session.beginTransaction();
session.save(entity);//persist方法也行
tx.commit();
session.close();
解释:
调用save方法后,瞬态的entity对象就会转变为持久态;
进行commit()后,Hibernate会隐式的调用session.flush()方法(可以显示调用),将session的中对象的变化从缓存中刷出;此时,session对象才会请求一个数据库连接。
调用close()方法后entity对象则脱离工作单元的管理,从持久态变成游离态对象。
3.3:更新对象
指把瞬态或者游离态对象的变化更行到数据库中
session.update(entity);
3.4:删除对象
session.delete(entity);
程序调用完上述代码后并没有在数据库中删除掉entity这条记录,而是当事物提交(commit)或者刷新缓存(flush)后才真正被删除。
版权声明:本文为博主原创文章,未经博主允许不得转载。