hibernate使用save持久化了实体后再改变实体的值
admin
2023-05-30 10:01:43
0
public static void addStudent(){
        sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
        Session session=sessionFactory.getCurrentSession();
        session.beginTransaction();
        Student student=new Student( "李四", 34);
        session.save(student);
        student.setName("王五");
        Iterator iterator=(Iterator) session.createQuery("from Student").iterate();
            while(iterator.hasNext()){
                System.out.println(iterator.next().toString());
            }
        
        session.getTransaction().commit();
    }

注意

session.save(student);
student.setName("王五");

session持久化了实体后,只是写入了session缓存中,commit前并没有写入数据库中,此时再改变

实体,保存到数据库的实体为修改过的实体。

hibernate使用save持久化了实体后再改变实体的值

public static void updateStudent(){
        sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
        Session session=sessionFactory.getCurrentSession();
        session.beginTransaction();
        Student student=(Student) session.get(Student.class, 2);
        student.setName("update");
        Iterator iterator=(Iterator) session.createQuery("from Student").iterate();
            while(iterator.hasNext()){
                System.out.println(iterator.next().toString());
            }
        
        session.getTransaction().commit();
    }

从数据库中查找id为2的记录后,此时session缓存中有了实体,直接修改实体的值,不用update,session提交后,数据库的记录依然被修改了

hibernate使用save持久化了实体后再改变实体的值

对于先查询再修改,

不写update,merge和

session.update(student);

session.merge(student);

都是一样的,commit后数据都会写入数据库

Student student=new Student(10,"update", 100);
        session.update(student);

直接new一个实体(其id=10的记录在数据库中不存在),直接update报错

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

此Student对象的id设置了自增,其id=10的记录在数据库中不存在,

Student student=new Student(10,"update", 100);
        session.merge(student);

结果数据库保存了记录,但是id不为10,而是按照自增的结果,为6(插入前最大为5)

hibernate使用save持久化了实体后再改变实体的值

Student student=new Student(11,"update", 100);
        session.saveOrUpdate(student);

而想象中可以完成此操作的saveOrUpdate()却也报错

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
Hibernate: 
    update
        Student 
    set
        age=?,
        name=? 
    where
        id=?

发出的sql竟然是update,怎么不是save,应该是自动选择才对?

相关内容

热门资讯

天津高空跳伞遇难女子原计划今年... 极目新闻记者 舒隆焕天津高空跳伞项目发生事故,一名女员工和教练遇难(极目新闻5月18日报道)。记者从...
这部电影,道尽了中国人的情义二... 12015年,我还在深圳工作。一个周末,我和小小明妈妈带着小小明,开车好几个小时,就为了看一眼大名鼎...
原创 宇... 「宇宙探索·伽马射线暴——宇宙中最亮的爆炸」 一、什么是伽马射线暴? 1967年,美国Vela...
2026年外贸企业谷歌SEO选... 一、引言:流量困局与增长迷思 2026年,外贸企业面临的营销困境正从“流量获取难”演变为“转化效率低...
原创 科... 你以为的宇宙,有可能是一个超级巨型黑洞,银河系在这个超大黑洞的内部,仅仅只是一粒微不足道的宇宙尘埃!...
伊朗外交部:现阶段谈判重点是结... 当地时间5月21日,伊朗外交部发言人巴加埃在接受媒体采访时表示,现阶段,谈判的重点是结束包括黎巴嫩在...
2026年专业可靠的抖音指环遥... 探索智能遥控新纪元:揭秘指环遥控器的核心技术演进 想象一下:当你在公园记录孩子的童真笑容,双手却...
原创 秦... 摘要:建文软件以“360°可视化”为核心引擎,助力秦皇岛多信建筑重塑“AI+工程管理”新范式。依托覆...
聚力新通信 智启6G未来 6G... 2026年5月21日,以“聚力新通信·智启6G未来”为主题的6G产业创新发展大会暨第九届“绽放杯”上...
别让伪科学教育,毁了孩子的未来... 从“量子波动速读”到“脑屏开发”,再到各类“脑波智慧机”“照相记忆”“蒙眼识字”培训,以及“近红外光...