您好,登錄后才能下訂單哦!
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持久化了實(shí)體后,只是寫入了session緩存中,commit前并沒有寫入數(shù)據(jù)庫中,此時(shí)再改變
實(shí)體,保存到數(shù)據(jù)庫的實(shí)體為修改過的實(shí)體。
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(); }
從數(shù)據(jù)庫中查找id為2的記錄后,此時(shí)session緩存中有了實(shí)體,直接修改實(shí)體的值,不用update,session提交后,數(shù)據(jù)庫的記錄依然被修改了
對(duì)于先查詢?cè)傩薷模?/p>
不寫update,merge和
session.update(student);
session.merge(student);
都是一樣的,commit后數(shù)據(jù)都會(huì)寫入數(shù)據(jù)庫
Student student=new Student(10,"update", 100); session.update(student);
直接new一個(gè)實(shí)體(其id=10的記錄在數(shù)據(jù)庫中不存在),直接update報(bào)錯(cuò)
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
此Student對(duì)象的id設(shè)置了自增,其id=10的記錄在數(shù)據(jù)庫中不存在,
Student student=new Student(10,"update", 100); session.merge(student);
結(jié)果數(shù)據(jù)庫保存了記錄,但是id不為10,而是按照自增的結(jié)果,為6(插入前最大為5)
Student student=new Student(11,"update", 100); session.saveOrUpdate(student);
而想象中可以完成此操作的saveOrUpdate()卻也報(bào)錯(cuò)
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=?
發(fā)出的sql竟然是update,怎么不是save,應(yīng)該是自動(dòng)選擇才對(duì)?
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。