千家信息网

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

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,public static void addStudent(){ sessionFactory=new AnnotationConfiguration().configure().bui
千家信息网最后更新 2024年11月30日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前并没有写入数据库中,此时再改变

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


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提交后,数据库的记录依然被修改了


对于先查询再修改,

不写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)


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

0