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("王五"); Iteratoriterator=(Iterator ) session.createQuery("from Student").iterate(); while(iterator.hasNext()){ System.out.println(iterator.next().toString()); } session.getTransaction().commit(); }
注意
創(chuàng)新互聯(lián)憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗,為客戶提供超值的營銷型網(wǎng)站建設(shè)服務(wù),我們始終認(rèn)為:好的營銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個人等客戶提供了做網(wǎng)站、網(wǎng)站設(shè)計服務(wù),以良好的商業(yè)信譽,完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。
session.save(student); student.setName("王五");
session持久化了實體后,只是寫入了session緩存中,commit前并沒有寫入數(shù)據(jù)庫中,此時再改變
實體,保存到數(shù)據(jù)庫的實體為修改過的實體。
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"); Iteratoriterator=(Iterator ) session.createQuery("from Student").iterate(); while(iterator.hasNext()){ System.out.println(iterator.next().toString()); } session.getTransaction().commit(); }
從數(shù)據(jù)庫中查找id為2的記錄后,此時session緩存中有了實體,直接修改實體的值,不用update,session提交后,數(shù)據(jù)庫的記錄依然被修改了
對于先查詢再修改,
不寫update,merge和
session.update(student);
session.merge(student);
都是一樣的,commit后數(shù)據(jù)都會寫入數(shù)據(jù)庫
Student student=new Student(10,"update", 100); session.update(student);
直接new一個實體(其id=10的記錄在數(shù)據(jù)庫中不存在),直接update報錯
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
此Student對象的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()卻也報錯
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)該是自動選擇才對?