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,应该是自动选择才对?

相关内容

热门资讯

部分美国AI模型在测试中被发现... 新华社伦敦8月5日电(记者张家伟)英国人工智能安全研究所发布的一份新报告显示,在该研究所实施的网络安...
聚焦联碱余热回收 共商节能降碳... 来源:中国日报网 近日,万润科技旗下万润新能源与双环科技、中国科学院理化技术研究所热力过程节能中心联...
存储暴涨不是坏事!WiFi 8... 来源:智能制造网 8月5日消息,本轮存储芯片的持续暴涨看起来全是负面影响,其实也不全是坏事,上游核心...
滴滴旗下99与巴西租车企业Mo... 新浪科技讯 8月6日下午消息,滴滴旗下巴西一站式本地生活服务平台99与巴西汽车租赁企业Movida签...
联黎部队:以军单日向黎发射11... △资料图联合国驻黎巴嫩临时部队(联黎部队)6日发表声明称,维和人员5日记录到以色列国防军共向黎巴嫩发...
常刷短视频的家长注意了!4招教... 当前,刷短视频已成为人们获取信息的重要途径。然而,部分账号为博取流量、推销课程或制造焦虑,通过AI合...
28枚导弹零拦截!基辅防空失灵... 战争大部分时间里,泽连斯基一直恳请西方盟友提供防空装备,并且屡屡得偿所愿。得益于他多方游说,华盛顿方...
全球首座16兆瓦张力腿浮式风电... 全球首座16兆瓦张力腿浮式风电平台“海油安澜号”于8月6日正式投运。据中国海油消息,该平台已成功接入...
天文望远镜观测到“猎鹰9”火箭... 新华社洛杉矶8月6日电(记者高山)欧洲南方天文台表示,其位于智利的甚大望远镜观测到美国太空探索技术公...
全球首个AI4S操作系统发布,... “相约深圳 见证奇迹——APEC大会倒计时100天媒体采风活动”期间,南都湾财社记者走进深圳科技企业...