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)后才真正被删除。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值