session 的几个主要方法:
1,save方法和persist方法的区别;
2,delete,删除对象
3,update,更新对象,如果数据库中没有记录,会出现异常。
4,get,根据ID查,会立刻访问数据库。
5,load,根据ID查,(返回的是代理,不会立即访问数据库)
6,saveOrUpdate,merge(根据id和version的值来确定是save还是update),调用merge你的对象还是脱管的。
7,lock(把对象变成持久对象,但不会同步对象的状态)
8,flush 把缓存中的数据刷新到数据库。
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。
其区别在于:
1,如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
2,Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。
3,load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据库读取。
补充:load的懒加载的理解,见后面部分。
对于和ibernate而言,对象有三种状态:瞬时对象,持久对象,游离对象或脱管对象
1.瞬时(transient):数据库中没有数据与之对应,超过作用域会被jvm的垃圾收集器回收,一般是new出来且与session没有关联的对象
2.持久(persistent):数据库中有数据与之对应,当前session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到 )。
3,脱管(detached):数据库中有数据与之对应,但当前没有session与之关联;脱管对象状态发生改变,hibernate不能检测到。
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.save(user);
user.setUserName("new name");
tx.commit();
System.out.println("end");
上例中,在session.save(user)执行后,user就是持久对象(数据库中有记录了同时和session关联,接受hibernate的管理),所以下一句user修改自己的属性,它的动作被hibernate检测到,在事务提交时能够同步更新到数据库中去。在执行过程中,hibernate执行两个动作:
Hibernate: insert into user (userName, birthday, id) values (?, ?, ?)
Hibernate: update user set userName=?, birthday=? where id=?
既然如此,对象的更新能够自动被监测执行,那么session对象的update方法岂不是英雄无用武之地了?其实不然,当一个对象处于游离状态时,可以调用session的update方法,手动地把信息更新到数据库中去。
再者,有时候你接受传过来的一个对象,你有时候并不知道该对象是瞬时的还是脱管的,那么该怎么办呢?这是就可以调用session对象的saveOrUpdate方法。hibernate内部可以根据对象的id的值来判断对象的状态,id无值则为瞬时对象,有值说明是脱管对象,从而执行相应的动作。调用了saveOrUpdate方法,对象的状态变为持久,而使用merge方法(功能和saveOrUpdate差不多),对象的状态变为脱管。
对象的状态转化图如下:
分享到:
相关推荐
在Hibernate中,有三种主要的对象状态:瞬时状态(Transient)、持久状态(Persistent)、和游离状态(Detached)。瞬时状态的对象是刚被实例化,尚未与数据库中的数据进行关联。持久状态的对象与Session关联并被...
总结来说,`hibernate-memcached-1.1.0-sources.zip`提供了一个实现Hibernate与Memcached整合的完整示例。通过深入学习和理解源码,我们可以更好地掌握如何在项目中使用Memcached作为Hibernate的二级缓存,从而提升...
2. Session:Session是Hibernate的主要工作单元,负责管理对象的状态,提供事务管理和缓存功能。它在应用程序与数据库之间提供了一种临时性的容器,用于保存和检索对象。 3. Configuration:配置文件(hibernate....
在这个发行版中,API文档详细地介绍了每个接口、类和方法的用法,帮助开发者快速掌握如何创建Session工厂、开启和提交事务、执行查询、管理对象状态等操作。特别地,Criteria API和HQL(Hibernate Query Language)...
《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...
这些资料构成了一套完整的Hibernate学习路径,从基础到高级,从配置到实践,对于理解Hibernate的核心机制和提升开发技能都非常有帮助。通过阅读和研究这些内容,开发者可以更熟练地运用Hibernate进行数据库操作,...
**hibernate学习总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。在Java世界中,Hibernate 提供了一种在对象模型和关系数据库之间进行转换的机制,使得开发...
总结,"Hibernate-3.2-API-EN.rar"文档是深入学习和理解Hibernate 3.2的关键资源,涵盖了从基本概念到高级特性的全面内容,对Java开发者而言是不可或缺的参考资料。通过深入学习和实践,开发者可以充分利用Hibernate...
总结来说,“hibernate-jpa-2.1-api-1.0.0.draft-6-sources”不仅是一个软件包,更是学习和掌握Hibernate JPA 2.1实现的宝贵资料。通过深入研究,开发者可以更好地理解和利用这个强大的持久化框架,提高开发效率,...
- Session:是Hibernate的主要工作单元,负责与数据库的交互,提供了事务管理和对象状态管理。 - Criteria API:提供了一种动态构造查询的方式,比HQL更为灵活。 - Query和HQL:Hibernate查询语言,允许开发者以...
Hibernate是Java开发中的一款强大的对象关系映射(ORM)框架,它为开发者提供了一种在Java应用程序中操作数据库的面向对象方式,极大地简化了数据库操作的复杂性。通过使用Hibernate,开发者可以避免直接编写SQL语句...
包含的源码文件可以帮助开发者深入理解Hibernate的工作原理,例如Entity Manager、Query接口的实现,以及持久化过程中的对象状态管理等。这对于调试问题、优化性能以及扩展自定义功能非常有帮助。 总结,"hibernate...
【北大青鸟Hibernate学习资料】 Hibernate是一个开源的Java ORM(对象关系映射)框架,它为开发者提供了在Java应用中管理关系数据库数据的便捷方式。本学习资料集合了多个关于Hibernate的重要主题,包括对象关系...
【标题】:“Hibernate4的一些总结” 【描述】:这篇博客主要涵盖了Hibernate4框架在实际开发中的应用和理解,作者通过个人实践对Hibernate4的核心特性和使用技巧进行了深度解析。 【标签】:“源码”和“工具”这...
在Hibernate框架中,实体对象具有三种主要的状态:瞬时态(Transient)、持久态(Persistent)以及脱管态(Detached)。这些状态有助于理解对象与数据库之间的交互过程。 - **瞬时态**:对象尚未被持久化到数据库中...
4. **annotations**:包含了Hibernate的注解处理器和API,支持注解驱动的实体定义。 5. **examples**:提供了示例代码,帮助开发者快速上手。 三、核心组件解析 1. **SessionFactory**:是Hibernate的核心接口,...