中国学网 - 学路上 - 儿童网 - 微电影 - 经验 - 学院 - 突袭网 - 商务网 - 笑话 - QQ - 我搜你 - 新闻 - IT科技 - 易沃网 - 文档库 - 3G - 软件下载 - 源代码 - 书法大师

关于hibernate修改数据的疑惑

来源:互联网  责任编辑:小易  时间:2015/11/20 23:16:41
用户提出问题:关于hibernate修改数据的疑惑,具体如下:

各位大神,请教一个关于hibernate修改数据的问题,看代码

    public void addUser(){
        System.out.println("begin.......");
        Session session = null;
        Transaction transaction = null;
        session = SessionFactoryUtil.getSessionFactory().openSession();
        transaction = session.beginTransaction();
        System.out.println("开始修改用户信息");
        User u = (User)session.get(User.class, 2);
        u.setUsername("ddTest");
        session.saveOrUpdate(u);
        System.out.println("修改用户信息成功。。。。");
        transaction.commit();
        session.close();
        System.out.println("end.......");
    }

这样可以把一个ID为2的用户数据name改为ddTest,没有什么疑问。再看

    public void addUser(){
        System.out.println("begin.......");
        Session session = null;
        Transaction transaction = null;
        session = SessionFactoryUtil.getSessionFactory().openSession();
        transaction = session.beginTransaction();
        System.out.println("开始修改用户信息");
        User u = (User)session.get(User.class, 2);
        u.setUsername("ddTest");
        //session.saveOrUpdate(u);
        System.out.println("修改用户信息成功。。。。");
        transaction.commit();
        session.close();
        System.out.println("end.......");
    }

这样,不用saveOrUpdate,数据一样被成功修改。这是为什么呢?是事务在提交时把一级缓存里的对像flush到数据库了吗?那如果这样的话要saveOrUpdate之类的方法还有什么用呢?求高手大神解惑,小弟在此感谢。

通过互联网整理获得以下解决方法:

=================1楼=====================

你没有分清Hibernate里面实体的状态,你这两个例子里面实体的状态都是“持久”的状态(都是你刚查出来的,实体是在session里面持久态的)
考虑如果是从画面取来的值,设置到了实体里面,这时候这个实体是和session脱离的“瞬时”状态,这种东西用saveOrUpdate才有意义。

你可以看看Hibernate的API的程序,当你传进saveOrUpdate方法的实体是一个“持久”状态的实体,那么它什么都不做的,就和你第二个例子相同。

如果你传入的是一个“瞬时”态的东西,比如你新做出来的,或者从别的已经close的session里面查出来的东西,那么再调用它就有意义了。
他会看ID是否有,来决定做更新还是插入,还会去检查版本号(如果你配置了版本检查的话)。。。等等一系列动作。

=================2楼=====================

hibernate的update方法不是sql update的替代品或者翻译。

hibernate屏蔽了你直接操作数据库操作sql。

update也好,直接set也好,你修改的目标都是内存中的某个对象模型,而hibernate会将这个对象的修改同步到数据库。

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 使用Mybatis执行sql时如何统一校验输入参数?
  • js里这种表述式是啥意思?return (y1 - y2 > 0 ? "Up" : "Down");
  • 请问基于云架构的J2EE架构应该怎么做?
  • spring ,hibernate 都是用到了asm字节码技术,请问它们具体都拿ASM来实现了什么功能?或者说在哪个功能上用到的
  • 如何判断操作系统是32位还是64位?
  • DBA_OBJECTS + ROWNUM 和 DUAL + ROWNUM 一个结果比较的疑问
  • ajax缺点?
  • 判断字符串是否是数字开头
  • 用java程序监视mysql的变化。求方法
  • 如何对URL地址栏传参的信息进行加密或保护
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved