当前位置:首页 > 开发 > 数据库 > 正文

Hibernate在更新时,是可以不用session的update方法的(转帖)

发表于: 2015-03-27   作者:BreakingBad   来源:转载   浏览:
摘要: 地址:http://blog.csdn.net/plpblue/article/details/9304459 public void synDevNameWithItil() {Session session = null;Transaction tr = null;try{session = HibernateUtil.getSession();tr = session.beginTran

地址: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在更新时,是可以不用session的update方法的(转帖)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
引用 update 更新表中多条记录。从另一个表中调用记录。 实例效果图: 我的应用: 创建主表: CREATE
hibernate 三种状态深入分析 分类: 三大框架 2008-11-08 03:03 9582人阅读 评论(8) 收藏 举报 hibe
转自: http://www.cnbruce.com/blog/showlog.asp?cat_id=28&log_id=444 呵呵,很小的时候,爸爸从哈
上一篇《插入方法:Insert API-Medoo使用指南》中介绍了如何使用Medoo的Insert方法来保存数据,本篇
转帖地址:http://www.cnblogs.com/xuanfeng/archive/2009/06/04/1494735.html 需求: 有个ASP.NET
打开 Finder,然后点击菜单栏中的前往——前往文件夹(或者快捷键 Shift+Command+G), 在路径中输
观察下图,就会发现很多以前没有用过的功能 下面进入重点 在命令行键入 VS2012.2.exe /layout , 接着
今天偶尔在网上看到了这篇文章, http://developer.yahoo.com/performance/rules.html,是Yahoo 人
前段时间的QCon北京2011大会里面有个探索式测试的分享,是Erik Petersen 演讲(资料下载)的,我由
本文出处:http://blog.csdn.net/chaijunkun/article/details/8621232,转载请注明。由于本人不定期
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号