地址: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浅谈代码案例。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
JAVA的hibernate手动获取session的方法
Hibernate Session释放模式
hibernate中session对象的状态详解
hibernate中session的管理描述。 hibernate中session的管理描述。
Hibernate 中对session的管理!
hibernate配置文件,session工厂学习,session链接数据库
可以对hibernate的 Session 和 Transaction 有更深入的认识 希望对一些概念比较模糊的人 有帮助
hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)
我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、...
hibernate session详细方法,值得珍藏
Hibernate持久层方法汇总 session.load, session.find, session.iterator, session.save, session.update, session.saveorupdate
Hibernate中session的merge以及update方法
手写hibernate的session实现简单增删改查,适合新手学习hibernate
No Hibernate Session bound to thread,没有绑定线程解决办法,找了好久才找到的
Session是Hibernate中应用最频繁的接口,Session也被称为持久化管理器,它负责所有的持久化工作,负责管理持久化对象的生命周期,提供第一级别的高级缓存来保证持久化对象的数据与数据库同步
hibernatetools-Update-4.1.1.zip
Hibernate_session_factory_配置
hibernate更新操作 hibernate更新操作
hibernate 经典描述对你理解会有一定的帮助的