guodongzuo 2015-01-09 15:05
浏览 287
已采纳

关于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之类的方法还有什么用呢?求高手大神解惑,小弟在此感谢。

  • 写回答

2条回答 默认 最新

  • weixin_42622339 2015-01-09 15:46
    关注

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

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘