网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

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

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


网页题目:hibernate使用save持久化了实体后再改变实体的值
本文路径:http://bjjierui.cn/article/pscpop.html

其他资讯