hibernate的session相关

本文介绍了Hibernate中对象的三种状态:瞬时、持久化及脱管状态,并详细讲解了save、update、saveOrUpdate等核心API的功能及使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个Hibernate应用中,Java对象可以处于以下三个状态之一:

 

1.临时状态(Transient)【瞬时状态】

处于这个状态的对象还被没有纳入Hibernate的缓存管理体系,跟任何session都不关联,在数据库中也没有对应的记录。

 

2.持久化状态(Persistent)

处于这个状态的对象位于Session的缓存中,并且和数据库中的一条数据记录相对应。

 

3.游离状态(Detached)【脱管状态】

处于这个状态的对象不再位于Session的缓存中,它与临时对象的最大区别在于,游离对象在数据库中还可能存在一条与它对应的记录。

 

session中的API

1.save()方法

Hibernate认为通过new产生的持久化类实例为瞬时对象,save提供了将瞬时对象转化为持久化对象的手段

功能:使瞬时对象持久化

例:

    Student stu = new Student();

    stu.setName("Ken");

    sesion.save(stu);

 

2.update()

功能:使脱管对象持久化

例:

    Student stu = (Student)session1.load(Student.class,2);

    stu.setName="tom";

    session1.flush();//修改持久化对象  ,可以通过这种方式直接修改

    session1.close();//对象脱管

 

    stu.setName="Keaven";

    session2.update(stu);//脱管对象持久化,必须为脱管,否则抛出异常

 

3.saveOrUpdate()

功能:既能保存瞬时对象又可以更新、重新关联脱管对象

  该方法同时具备save()和update()方法的功能,并具有自动检测参数类型的功能

  若参数为瞬时对象,执行save

  若参数为脱管对象,执行update

例:

     Cat cat1 = (Cat)session.load(Cat.class,5);

     Cat cat2 = new Cat();

     session.saveOrUpdate(cat1); 

     session.saveOrUpdate(cat2); 

 

4.delete()

功能:从数据库中移除与对象相应的记录

      移除脱管对象或持久化对象

 

5.load()和get()

    功能:根据某个对象的持久化标识符来获取该对象

    A.如果找不到符合条件的纪录

       get()方法将返回null.而load()将会抛出ObjectNotFoundEcception.

   B.load()方法可以返回实体的代理类实例,而get()永远只返回实体类.

    C.load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找.

例:

   Cat cat = (Cat)session.load(Cat.class,CatID);

 

注意:在不确定数据库中是否有匹配记录的情况下,一般使用get

 

6.flush()

自动将持久化对象的数据与数据库同步

 

7.clase()

功能:清空session缓存,缓存中的所有持久化对象变为脱管对象,若在应用程序中没有变量引用这些对象,将被垃圾回收。

 

8.evict()

功能:从缓存中删除一个持久化对象,使其变为脱管对象,可以提高性能

大多数情况下不推荐使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值