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不能检测到。
Java代码
1.Session session = HibernateUtil.getSession();
2. Transaction tx = session.beginTransaction();
3. session.save(user);
4. user.setUserName("new name");
5. tx.commit();
6. System.out.println("end");
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 是一个流行的 Java 开发框架,用于简化数据库...理解 Hibernate 对象状态及其转换对于有效管理和优化数据库操作至关重要。正确使用这些状态和保存方法能够避免数据冗余和丢失,提高应用的性能和数据一致性。
在Java的持久化框架Hibernate中...正确管理对象状态可以帮助优化数据库交互,减少不必要的查询,提高系统的整体性能。在实际开发中,开发者需要根据业务需求和性能考虑,灵活运用这些状态,确保数据的一致性和完整性。
Java面试题57.hibernate对象状态及其转换.mp4
java工程师
Hibernate 对象状态之间的神奇转换 Hibernate 框架中对象状态之间的转换是非常重要的概念,它们之间的转换关系非常复杂。本文将详细介绍 Hibernate 对象状态之间的神奇转换,包括瞬时态、持久态、脱管态 ثلاث种...
在处理大量数据或复杂的业务逻辑时,正确地使用Hibernate对象状态可以极大地提高效率和性能。例如,当处理大量对象时,可以先将对象设置为游离状态,待所有更改完成后再一次性提交,以减少数据库事务的频繁交互。
理解Hibernate对象状态对于优化应用性能至关重要,例如,正确地管理Session的生命周期可以减少不必要的数据库交互,提高效率。在处理大量数据时,避免在事务中保留大量持久态对象,可以防止内存溢出。而合理使用脱管...
在Java的持久化框架Hibernate中,对象存在三种不同的状态,分别是持久态(Persistent)、自由态(Transient)和游离态(Detached)。这三种状态分别对应了对象与数据库的关联程度,理解它们对于高效地使用Hibernate...
hibernate中session对象的状态详解
同时,文档《Hibernate对象状态及一对多关联.doc》详细介绍了如何设置和管理一对多关联,这种关联在企业级应用中非常常见,例如一个用户可以有多个订单。 2. **一对一和多对多关联** 在《Hiberate一对一和多对多...
一、Hibernate对象三状态 1. 游离态(Detached):对象在应用程序中创建,但尚未与Session关联。对象的状态和数据库中的记录可能不一致。 2. 瞬时态(Transient):对象刚被创建,与Session关联,但尚未持久化到...
本人在厦门邦初培训时候 使用的快速入门精简文档 ...对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。 延迟装载 迫切左外链接 HQL检索方式 QBC检索方式 本地SQL检索方式
在 Hibernate 框架中,Java 对象的状态管理和 Session 缓存是核心概念,它们直接影响着数据的持久化过程和数据库...同时,根据具体应用需求,选择合适的缓存清理策略和对象状态转换时机,以达到最佳的数据库操作效果。
4. Hibernate对象状态: Hibernate将对象分为四种状态:瞬时态、持久态、托管态和游离态,理解这些状态对于正确使用Hibernate至关重要。 5. Hibernate映射机制: 使用XML或注解来定义对象和表之间的映射关系,...
五、Hibernate对象状态 Hibernate将对象分为四种状态:瞬时态、持久态、托管态和脱管态。理解这些状态及其转换对于正确使用Hibernate至关重要。 六、查询语言HQL与 Criteria API HQL(Hibernate Query Language)是...
3. Hibernate对象状态: Hibernate中的对象有三种状态: - **瞬时态(Transient)**:对象在内存中创建,但尚未与数据库关联。使用`session.save()`或`saveOrUpdate()`方法可以将瞬时对象转化为持久态。 - **持久态...
Session提供了事务管理和缓存功能,确保了对象状态的正确管理。例如,一级缓存(First Level Cache)自动管理持久态对象,而二级缓存(Second Level Cache)则可跨Session共享数据,提高性能。 6. HQL与 Criteria ...
#### Hibernate 对象状态 Hibernate 支持对象的多种状态管理,包括瞬时状态(Transient)、持久状态(Persistent)和游离状态(Detached),每种状态对应不同的行为。 #### HQL 和 Native SQL - **HQL**(Hibernate...
- **Hibernate对象状态**: 介绍了瞬态、持久、游离等状态。 - **使对象持久**: 如何将对象变为持久状态。 - **加载一个对象**: 使用不同的方法加载持久化对象。 - **查询**: 使用HQL或其他查询语言执行复杂查询。
Hibernate对象状态 对象在Hibernate中有以下几种状态: - **瞬时态(Transient)**:对象刚刚被创建,还没有与Session关联,没有持久化标识符(ID)。如果对象在这个状态下被垃圾回收,那么所有关于该对象的数据...