地址:http://blog.csdn.net/plpblue/article/details/9304459
public void synDevNameWithItil()
{
Session session = null;
Transaction tr = null;
try
{
session = HibernateUtil.getSession();
tr = session.beginTransaction();
tr.begin();
Query query = session.createQuery("...");
List<Device> devList = query.list();
for(int i=0;i<devList.size();i++)
{
Device device=devList.get(i);;
String itilName= getDeviceNameFromItil(device.getIp());
if(StringUtils.isNotEmpty(itilName))
{
device.setName(itilName);
}
}
tr.commit();
}
catch (Exception ex)
{
_log.error("", ex);
HibernateUtil.rollBack(tr);
}
finally
{
HibernateUtil.closeSession(session);
}
}
这段代码就是想更新一下数据库中的Device对应表的name字段。我的同事觉得,怎么没调用session.update方法去更新device呀。当时我很是惊呀,我一直以为这是hibernate最普通的用法。没想到我同事这样的老行家,也还有误区。
其实hibernate实现的是持久化类对象和数据库之间的透明映射。hibernate努力想做到的就是让hibernate的使用者,不用去关心对象如何从数据库中存入和取出。
Session提供了三个和存储相关的常用方法:save、update、delete。很多人认为,调用这三个方法时,hibernate就会向数据库发出:insert、update、delete SQL语句。其实不完全是这样的,这三个方法的直接语意,是用来改变持久化对象的状态,而不是用来指挥hibernate向数据库发出sql的。比如:从session中读取一个对象后,立即调用update方法更新,hibernate会忽略这个update调用。
那这三个方法有什么用呢?它们是用来让持久化对象进行状态切换的,如下所示:
save : 从临时状态 ==》持久化状态
update: 从游离状态 ==》持久化状态
delete: 持久化状态 ==》临时状态
在session中存在的持久化对象是处于持久化状态的。
session关闭后,之前从session中读取的持久化对象即为游离态。
在数据库中不存在的持久化对象为监时态。
上边举的例子,之所以调update不起作用,是因为当前对象已经是持久化状态了,不需要状态切换。
当事务提交时,hibernate会自动按照一定的策略将session中的持久化对象,同步到数据库中,从而自动使数据库的状态和session中的对象状态完全一致。如果要在事务提交前同步,则可以使用session的flush方法。
这是hibernate的一个优秀的设计。它使得hibernate的使用者,可以专注于对象的变化(对象的状态、属性、关系)而不必考虑,对象的变化如何反映到数据库上。
正是由于这一点,使得在hibernate上构造充血模型成为可能。因为,可以直接将持久化类做为领域对象,由hibernate负责领域对象和数据库的同步。
有不馁之处,敬请指正!
[郑重声明]本文章转自http://www.javaeye.com/topic/866091 ----点击查看更多----
相关推荐
在这种情况下,使用Hibernate-nosession模式可以避免创建和管理Session的开销,从而提高应用性能。nosession模式并不意味着完全不使用Hibernate,而是尽量减少对Session的依赖,转而使用其他API,例如Query或...
在 Hibernate 中, update 方法可以更新整个对象的所有字段。如果我们直接使用 Session.update(Object o) 方法,Hibernate 会生成一个更新所有字段的 SQL 语句。这可能会导致性能问题,特别是当某些字段类型是文本...
8. **脏检查和自动提交**:Hibernate会定期进行脏检查,检测对象的状态变化,并在事务提交时自动更新数据库。这意味着,只要在事务范围内对对象进行修改,无需显式调用update()方法,Hibernate也会自动处理。 9. **...
在处理数据更新时,Hibernate提供了多种方法,但同时也可能会遇到一些常见问题。本篇文章将深入探讨Hibernate更新机制及其可能遇到的问题,旨在帮助开发者更好地理解和解决这些问题。 1. **基本更新操作** ...
当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 在开始使用Session之前,需要配置Hibernate的环境,包括创建SessionFactory,...
更新数据时,首先需要从数据库加载需要更新的对象,然后修改对象的属性,最后调用Session的update()方法。Hibernate会识别出对象的变化,并生成对应的SQL更新语句。 4. 查询(Query) 查询是通过Session的get()、...
1. `save()` 和 `update()`: `save()`用于将新对象持久化到数据库,如果对象已经存在,可以使用`update()`来更新其状态。 2. `delete()`: 删除指定的对象,将其从数据库中移除。 3. `get()` 和 `load()`: `get()`...
6. **事件监听**:通过事件监听器,可以在对象的生命周期中执行特定操作,如预加载、后加载、预更新等。 实现这些功能需要深入理解JDBC、数据库理论、反射、设计模式等多个领域的知识。对于源码的阅读和分析,可以...
- **保持数据同步**:当对象在缓存中更新时,`Session`会同步这些更改到数据库,保证缓存中的对象与数据库一致。 - **解决关联对象问题**:对于关联的对象,`Session`确保在缓存中不会出现死锁情况。 `Session`通过...
当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被创建。SessionFactory是一个线程安全的单例对象,它根据Hibernate配置文件生成。创建SessionFactory通常在应用程序启动时完成,而...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...
因此,在批量更新时,需要定期调用 `session.flush()` 和 `session.clear()` 来清除一级缓存。 批量抓取 Hibernate 的批量抓取机制允许将多个INSERT 语句合并成一个批量插入语句,从而提高性能。在 Hibernate 配置...
然而,在使用 Hibernate 进行数据库操作时,经常会遇到 "No Hibernate Session bound to thread" 的错误信息。本文将详细介绍该错误的解决方案。 错误原因 "No Hibernate Session bound to thread" 错误信息通常是...
此外,如果对象在Session之外被更新,那么在更新之前需要调用`session.update(object)`来告诉Hibernate你打算修改这个对象。 总结来说,Hibernate的更新操作主要包括配置、创建SessionFactory、打开Session、查询...
通过合理配置,SessionFactory可以在多线程环境下高效地管理Session,如使用一级缓存(Identity Map)和二级缓存(如 Ehcache),提高查询效率。 6. **JTA(Java Transaction API)和JPA(Java Persistence API)...
在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)的关键部分。本文将深入探讨Hibernate Session的...
在Java编程中,Hibernate是一个非常流行的ORM(对象关系...通过以上步骤,你可以理解并实现Hibernate在Java应用中手动获取Session的方法。学习和熟练掌握这些知识,将有助于提高你在数据库操作方面的效率和代码质量。
在Java的持久化框架Hibernate中,`Session`是与数据库交互的核心接口,它扮演着连接应用程序和数据库的角色。`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的...
在实际使用中,开发者通常会在一个`Session`生命周期内进行一系列操作,然后在适当的时候调用`flush()`方法强制Hibernate同步数据库,最后在事务结束时调用`commit()`来完成事务。这些方法的正确组合使用是实现高效...