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<Student> iterator=(Iterator<Student>) 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ù),我們始終認為:好的營銷型網(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ù)庫的實體為修改過的實體。

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<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的記錄后,此時session緩存中有了實體,直接修改實體的值,不用update,session提交后,數(shù)據(jù)庫的記錄依然被修改了

hibernate使用save持久化了實體后再改變實體的值

對于先查詢再修改,

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

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=?

發(fā)出的sql竟然是update,怎么不是save,應(yīng)該是自動選擇才對?

文章題目:hibernate使用save持久化了實體后再改變實體的值
當(dāng)前地址:http://bm7419.com/article8/pscpop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、品牌網(wǎng)站設(shè)計、微信公眾號、虛擬主機、軟件開發(fā)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司