Hibernate的Session使用

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

  1. 瞬态,暂态,自由态;
  2. 由new命令开辟内存空间的Java对象,在内存中孤立存在,和数据库中的数据没有任何关系;
  3. 可以通过Session的save()或者saveOrUpdate()、persist()方法将瞬态对象与数据库相关联,将数据插入到数据库中,此时瞬态对象转变为持久化对象。

2)Persistent

  1. 持久化状态; 该状态的数据在数据库中具有对应的数据,并且拥有一个持久化标识;
  2. 可以通过Session的delete()方法将对应的数据库中的数据删除,此时持久化对象变成瞬态对象。
  3. 可以通过Session的close()或者clear()或者evict()方法,将持久化对象变成脱管对象,此时该对象具备数据库识别值,但是已经不再Hibernate持久层的管理之下。

3)Detached

  1. 脱管态,游离态;
  2. 持久态的对象如果与数据库记录不能保持同步,则该对象就转变为游离态;
  3. 游离态的对象仍然具备对应的数据库记录(即上面第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)后才真正被删除。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 11:59:43

Hibernate的Session使用的相关文章

Hibernate中Session的get和load

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象. public Object get(Class clazz, Serializable id); public Object get(Class clazz, Serializable id, L

在Hibernate的session中同时有两个相同id的同类型对象,修改失败

若在Hibernate的session中同时有两个相同id的同类型对象,修改会失败,报错:a different object with the same identifier value was already 解决方案: 使用merge() 如下情景: User u = dao.getUser(...) ; User u2 = ... ; u2.setId(u.getId()) ; //此时的session中就有了两个id一样的对象了, dao.update(u2) ; //这里就会报错了,

Hibernate中Session之get和load方法的真正区别

最近在学习SHH框架中的hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入很大.主要是对get方法的说法跟实际运行的结果不一致. 先说一下观点吧: get不支持lazy,load支持lazy: 数据不存在时,get返回null,load则抛出ObjectNotFoundException异常. load方法可以返回实体的代理类实例,而get方法直接读取数据库,所以直接返回

hibernate中session的获取使用以及其他注意事项

hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行数据查询时不是出现了"session is close"异常就是出现其他异常问题,痛定思痛,决定收集并整理相关资料,方便今后的使用. 一.session的获取 在hibernate中的Session对象通过SessionFactory来管理,可以通过使用openSession ().get

Hibernate管理Session和批量操作

Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本地线程绑定 Session对象的生命周期与JTA事务绑定 Hibernate委托程序管理Session对象的生命周期 在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Session管理方式,可选值包括 thread:Session对象的生命周期与本地线程绑定 jta*:Session对象的生

Hibernate中Session与本地线程绑定

------------------siwuxie095 Hibernate 中 Session 与本地线程绑定 1.Session 类似于 JDBC 的连接 Connection 2.Session 对象是单线程对象,只能自己使用,不能共用 将 Session 与本地线程绑定,保证 Session 对象绝对是一个单线程对象 3.Hibernate 帮助我们实现了 Session 与本地线程绑定(底层是 ThreadLocal) 4.获取与本地线程绑定的 Session (1)在 Hiberna

atitit. 解决org.hibernate.SessionException Session is closed

#--现象:: org.hibernate.SessionException Session is closed 一呱走中个. #--原因 2.eichkyeu  e, log hteu yva parse token e...  cheocho sh   from>form 3.saecyeu e .... 4.    Query cq = ss.createSQLQuery(checkHql);>>> Query cq = ss.createQuery(checkHql); b

关于hibernate的session.createSQLQuery(sql)直接调用底层SQL后,返回结果集的问题

数据库中有如下信息name,sex张三.男李四.女通过Hibernate的  createSQLQuery 可以直接调用底层SQL语句如下:List list = (List)getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException,SQLException { Query query = sessio

hibernate 管理 Session(单独使用session,非spring)

Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 Session 对象的生命周期与 JTA 事务绑定 Hibernate 委托程序管理 Session 对象的生命周期 在 Hibernate 的配置文件中, hibernate.current_session_context_class 属性用于指定 Session 管理方式, 可选值包括 thread: Session 对象的生命周期与本地线程绑定 jta*: Session 对象

hibernate中session

hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果只是单独的hibernate程序的话. 获得session之后,打开事务,操作数据库,提交(回滚事务),关闭session.就这样完成了操作DB ? Hibernate中session的使用: 在Hibernate中session主要是用来操作数据库? Hibernate在操作数据库前需要得到Ses