hibernate使用save持久化了实体后再改变实体的值
短信预约 -IT技能 免费直播动态提醒
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<Student> iterator=(Iterator<Student>) 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<Student> iterator=(Iterator<Student>) 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,应该是自动选择才对?
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341